2010-04-22 25 views
14

sto leggendo su come utilizzare git come client svn qui:È richiesto git svn rebase prima di git svn dcommit?

http://learn.github.com/p/git-svn.html

Quella pagina suggerisce che fate git svn rebase prima di git svn dcommit, che rende perfettamente senso; è come fare svn update prima di fare svn commit. Poi, ho iniziato a guardare la documentazione per git svn dcommit (mi chiedevo cosa la 'd' è di circa):

http://git-scm.com/docs/git-svn

Bisogna scorrere verso il basso un po 'per vedere la documentazione sul dcommit, che dice questo:

impegni ciascuna diff da una testa specificato direttamente SVN, quindi rebase o reset (a seconda se non c'è un diff tra SVN e la testa).

Questo mi confonde, perché se si fa come dice la prima pagina, non ci saranno cambiamenti per tirare giù da svn una volta che la prima parte di dcommit finisce.

Sono confuso anche dalla parte che parla di reset; non viene ripristinato git per rimuovere le modifiche dall'area di gestione temporanea?

Perché rebase o reset follow (la prima parte di) a dcommit?

risposta

19

Diniego: Io generalmente faccio tendono a correre git svn rebase prima di fare un git svn dcommit. Di solito mantengo le mie modifiche in un altro ramo git, in modo che il rebase non abbia alcuna possibilità di fallire. Io uso git rebase master nel mio ramo argomento per aggiornarlo. Quindi passo al ramo master e uso git merge per incorporare le modifiche dal mio ramo argomento in master (questo è un avanzamento rapido a causa del rebase).

La mia spiegazione di seguito spiega perché questo non è meccanico necessario, ma sono d'accordo che è una buona idea da fare. Le tue modifiche potrebbero non causare conflitti in termini di diff e fusione, ma se il tuo codice è dcommit senza ottenere le ultime modifiche da svn e rivedere i loro effetti, potresti commettere il codice in svn che in realtà non fa la cosa giusta.


non si hanno a git svn rebase prima di eseguire git svn dcommit. Se le modifiche che vuoi dcommit sono in file che non sono stati modificati in svn dopo le ultime modifiche recuperate, git-svn non mostrerà un conflitto. In questo modo, potresti commettere modifiche a un repository svn usando un repository git che non ha tutte le ultime modifiche da svn.

Diciamo che avvio un repository svn che contiene due file, foo.txt e bar.txt. Hanno solo una revisione fino ad ora. Faccio un git svn clone per iniziare a monitorare il repository svn usando git.

 
$ git log --oneline --decorate 
7e72290 (git-svn, master) Initial commit. 

si apportano modifiche al foo.txt e li git commit al master filiale locale, in modo che si muove davanti a git-svn.

 
$ git log --oneline --decorate 
aa70eca (master) Added a line to foo. 
7e72290 (git-svn) Initial commit. 

Quello che non capiscono è che il vostro amico già impegnata modifiche bar.txt come revisione svn 2.

Ora, quando si esegue git svn dcommit da master, git cercherà di modifiche tra dove siete e dove git-svn lasciato fuori. In questo caso, ne hai uno solo: aa70eca. git prova ad inviare quel diff al tuo repository svn.

 
$ git svn dcommit 
Committing to [svn repo address] ... 
     M  foo.txt 
Committed r3 
     M  bar.txt 
r2 = 12b95b96e11f782f31b07a78756660cb82437ca2 (refs/remotes/git-svn) 
     M  foo.txt 
r3 = d4a7b84e0383f3af5fb0db439169c9f1b8af1152 (refs/remotes/git-svn) 
W: aa70ecae4121854ac3754fb882a483b67d706a4a and refs/remotes/git-svn differ, using rebase: 
:100644 100644 5771152459bfaa7cc62caa3b6b4d24e52ab8e447 dbfaecb10330d0509e092f1891a4a7e673802413 M  bar.txt 
First, rewinding head to replay your work on top of it... 
Nothing to do. 

$ git log --oneline --decorate 
d4a7b84 (git-svn, master) Added a line to foo. 
12b95b9 Added to bar. 
7e72290 Initial commit. 

Si può vedere che il commit riuscito come svn revisione 3. Quando git-svn quindi sincronizzati vostra storia svn locale con il repository svn, è andato a prendere tutti i nuovi commit tra cui la modifica appena inviato al svn. Noterai che questa modifica (d4a7b84) ha un hash SHA diverso da quello che avevi in ​​git (aa70eca). Ciò è dovuto a una varietà di cose: diversi timestamp di commit, nomi di autori potenzialmente diversi, git-svn-id nel log del commit recuperato da svn e antenati diversi — lo svn r3 scaricato ha r2 come genitore, ma il tuo commit git è stato disceso da r1.

In questo scenario, è stato trovato un diff dopo il recupero tra la testina git corrente (master) e SVN, poiché il contenuto in r2 è cambiato foo.txt. Di conseguenza, git-svn verrà rebase.

Se faccio un cambiamento e nessun altro svn commit si sono verificati nel frattempo (o mi erano stati in esecuzione git svn rebase per tenersi aggiornati), quindi git-svn non troverà un diff tra la testa e SVN, quindi può solo reset:

 
$ git svn dcommit 
Committing to [svn repo address] ... 
     M  foo.txt 
Committed r4 
     M  foo.txt 
r4 = 533f7337999778628cf39fcd9155d085eb1c2b89 (refs/remotes/git-svn) 
No changes between current HEAD and refs/remotes/git-svn 
Resetting to the latest refs/remotes/git-svn 
+0

re git svn rebase non richiesto prima di "commit": commettendo, vuoi dire git svn dcommit vero? Separatamente, vuoi dire che nulla si confonderà più tardi se spingo i cambiamenti dal mio git locale allo svn remoto usando git svn dcommit supponendo di non aver toccato nessun file che è cambiato in svn dal mio ultimo git svn rebase? Sono anche confuso su una serie di cose nel tuo secondo paragrafo. 1) C'è qualche motivo per reimportare? 2) Stai dicendo che lo hai dedotto dal contenuto dei messaggi di commit? – allyourcode

+0

3) Cosa intendi con "git-svn può ripristinare il contenuto recuperato da svn"? Pensavo che git reset fosse usato per rimuovere i cambiamenti dall'area di staging; invece, sembra che tu stia dicendo che resettare cambia la revisione a cui punta il ramo corrente. 4) Come possono essere apportate modifiche a svn dopo aver fatto git svn dcommit? Questo comando non spinge tutte le modifiche dal mio repository git locale al repository svn remoto ?? – allyourcode

+0

Ho riscritto la maggior parte della mia risposta per includere esempi che dovrebbero illustrare il motivo per cui il recupero + rebasing dopo dcommit è cruciale. Spero che dovrebbe affrontare i punti 1 e 2. – MikeSep

Problemi correlati