2012-04-12 11 views
7

[Update]Come affrontare Git-svn quando è necessario utilizzare sia Git e Subversion

Per maggiori dettagli, La ragione per cui il motivo per cui cerco di fare Git puro a casa è che, la mia azienda vorrebbe per passare a Git ma al manager non piacerebbe apportare modifiche perché lo sviluppatore non ha conoscenza con Git sul nostro repository. Quindi, quello che cerco di fare è, cerco di far usare a tutti git puro mentre qualcuno può unirsi a Subversion durante questa fase di apprendimento. Quindi, in caso di emergenza, possono ancora usare Subversion.

Quindi, prima che tutti abbiano familiarità con Git, non posso trasferire repository per utilizzare Git puro. Quindi, avrà sia l'aggiornamento su Subversion e Git. (e il repository principale adesso è Subversion). Quindi, cerco di rendere il modo in cui Git può funzionare senza intoppi durante il mio repository di sincronizzazione da parte di dcommit a Subversion.

[Domanda]

Sono nell'organizzazione che utilizzano Subversion come repository, così ho discarica come il mio Git personali (e in programma di utilizzare sostituire Subversion con Git in futuro)

Ora , Ho un repository che usa sia Git e Subversion (Main Source). Ho un problema con lo git svn rebase quando devo usare sia git che subversion.

mio flusso di lavoro è come qui di seguito

All'ufficio

  1. Il repository hanno Git-svn interfaccia
  2. ho sempre commesso il codice a Subversion con git svn dcommit da qui .
  3. spingo al mio repository git telecomando verso Bitbucket

At Home

  1. ho clonare il repository da Bitbucket
  2. Lavorare con e si impegnano a bitbucket

Ora, di nuovo all'ufficio

  1. git pull
  2. git svn rebase
  3. git svn dcommit
  4. git push

Al punto 4.Ho un problema che ho già Ribasato mio ramo

problema ora qui, quando sono tornato a casa

Quando torno a casa, non si può usare 'git fetch' perché il ramo è già ribasato. Quindi, devo rimuovere il ramo con ramo git -D ..... e poi git checkout di nuovo.

Quindi, cerco il modo in cui siamo in grado di uso concomitante sia repository Git e Subversion e fare andare bene con Git funzionamento dopo fatto con git svn rebase o git svn dcommit.

Nota. Non preferirò usare nessuno git-svn a casa. Prova ad andare avanti per usare solo Git.

risposta

0

Trovato la soluzione dal libro Version Control with Git. Pagina 295.

Invece di uso locale - ramo principale, hanno alla cassa ramo remoto

git checkout remote/master (Detach HEAD) 
git merge --no-ff master (merge the local master) 
git svn dcommit 
git push origin (update to git Repository) 

Questo modello è per una persona che si fonderanno di nuovo al repository Subversion, mentre l'altro lavoro su Git puro o puro Subversion . In questo modo, gli utenti Git possono utilizzare Git senza problemi di unione.

0

Non hai detto perché stai tenendo svn dopo tutto. Ma la mia raccomandazione è di iniziare con un repository git pulito, una volta per tutte. Ed evitare i problemi non necessari.

credo sia Casey che ha fatto la migliore risposta sulla migrazione a git: How to migrate SVN repository with history to a new Git repository?

Naturalmente si deve fare un backup e quindi avviare il processo.

Un'altra idea è che se il rebase è il problema, perché non utilizzare un aggiornamento svn puro, e quindi eseguire il commit delle modifiche su Git (solo git commit), come se l'avessi scritto tu stesso.

+0

MacroA, se è il mio repository, tutto è facile da gestire. ma quando lavori in compagnia di un team di sviluppatori di grandi dimensioni. Quello che ti serve è difficile da fare. Ci sono ancora molti che fanno affidamento su di essi come tale sistema di distribuzione. qualcosa non può essere ininterrotto, tranne che tutto è pronto per la migrazione. – scalopus

2

Ok, il problema principale qui sembra essere che non si può davvero fare un git pull da casa se la cronologia è stata riscritta (in realtà dovrebbe funzionare ma proverebbe a fare un'unione non necessaria).

Il modo più semplice per superare il problema è utilizzare git pull --rebase. In questo modo, invece di unire i commit che hai fatto a casa con la punta del tuo ramo remoto, ribatterai tutti i commit fatti dalla creazione del tuo ramo sulla punta del ramo. Git sarà abbastanza intelligente da vedere che alcuni commit sono esattamente i sami e saranno automaticamente eliminati durante il rebase.

+0

Sono interessato al comando git pull --rebase. Funziona ancora nel caso in cui ho già fatto il git svn dcommit? perché lo sha1 è cambiato dopo. – scalopus

+0

Quando esegui un comando 'pull --rebase ', tenterà di rebase del tuo commit sul suggerimento corrente del tuo ramo remoto. Quindi sì, funzionerà. –

0

In realtà si dovrebbe essere in grado di git fetch ma invece di fondersi con git merge origin/branch è possibile utilizzare git rebase origin/branch. Questo dovrebbe risolvere il tuo problema

Se non aiuta provare git fetch quindi git checkout -f -B branch origin/branch l'ultimo comando forzerebbe la sovrascrittura sul ramo locale dal ramo remoto.

1

Suppongo che la causa principale del problema sia che git svn dcommit modifica il messaggio di commit per includere i dati di commit SVN. Dato che il messaggio è incluso nello SHA1 di un commit, questa modifica appare come un commit completamente diverso.

La mia soluzione sarebbe quella di avere una filiale nel repository dell'ufficio che sincronizzi con SVN e un'altra filiale (puramente git) in cui svolgere il tuo lavoro. Ogni volta che vuoi scambiare qualcosa con il repository SVN fai una fusione nell'una o nell'altra direzione.

Nel mio caso ho impostato un altro repository Git dedicato esclusivamente per lo scambio SVN. Ho un cron job che sincronizza il repository ogni 15 minuti con il server SVN. In questo modo non mi manca un git svn rebase.

Problemi correlati