2010-11-12 15 views
17

Il mio repo è SVN, e faccio tutto lo sviluppo con git. Abbiamo un layout standard, e ho inizializzato il mio repo locale con git svn init -s <url to repo>In che modo git-svn sa a quale ramo effettuare il dcommit?

Ecco il mio flusso di lavoro per lavorare con i rami:

# creates a new branch remotely 
git svn branch new-branch-name 

# switches to a branch or trunk locally 
git reset --hard name-of-branch 
git reset --hard trunk 

# merge changes from trunk into a branch 
git reset —hard name-of-branch 
git merge trunk 
git svn dcommit 

Questo ultimo comando precedente le modifiche al nome-del-ramo ramo. La mia domanda è, come lo sa questo git? Quando faccio git reset --hard foo, cosa succede esattamente?

Questo potrebbe giungere a una domanda generale su git. Ogni volta che provo a cercare una risposta mi confondo se l'integrazione svn è un caso speciale o no.

risposta

11

git-svn cercherà l'albero di commit per i commit degli antenati corrispondenti ai rami SVN attivi (i rami refs/remotes/... corrispondenti alle filiali in SVN). Diverà poi a quelli.

Si noti che non è necessario unire e quindi dcommit - il modello di ramificazione di SVN e Git non corrisponde, e questo tipo di cose può dissipare la cronologia SVN. Dovresti invece git rebase trunk quando sei nel ramo. (In alternativa, git svn rebase.)

Inoltre, tenere presente che il ramo che si controlla prima del rebase deve essere una filiale locale. In caso contrario, è possibile crearne uno con git checkout -b local-branch-to-create remote-branch. Quindi git rebase trunk.

Se si desidera eseguire lo schiacciamento di tutti i commit rebased in uno, eseguire dopo il rebase: git reset --soft trunk && git commit.

Una volta soddisfatti dei commit che ora vivono sulla parte superiore del bagagliaio, basta git svn dcommit per inviarli al server SVN.

+0

[1] "git-svn cercherà l'albero di commit per i commit degli antenati che corrispondono ai rami SVN attivi, quindi li inviterà a quelli". - A volte capita male - c'è un modo per me di specificarlo esplicitamente? [2] "questo tipo di cose può fubar la tua storia SVN" - quindi, la storia sarà unideale, ma la fusione dei file di codice dovrebbe andare bene, sì? –

+0

hmm, la pagina man dice che '--commit-url' dovrebbe essere usato solo per cambiare trasporto, e" L'uso di questa opzione per qualsiasi altro scopo (non chiedere) è fortemente scoraggiata. " –

+0

Se si desidera specificare un ramo specifico su cui eseguire il commit, eseguire semplicemente il rebase del ramo della funzione nella parte superiore del ramo remoto corrispondente nel repository Git. – cdhowie

2

Non è semplice come creare un ramo locale e tenere traccia di un ramo svn remoto? Quando fai un git svn init --stdlayout url-of-svn-repo, git fa cadere l'intero repository svn, lo comprime in modo che sia operativo con git.

Dopo di che si tratta solo di una questione di fatto di fare qualcosa di simile:

git checkout -b mybranch -t remotes/mybranch 

Se si dispone di una filiale locale di monitoraggio una filiale remota, git svn dcommit spinge solo al ramo a distanza cingolato.

+3

Ho provato questo e 'git svn dcommit -n' dice ancora che si sta impegnando per il trunk invece del ramo che voglio –

+0

Non è così semplice:" Git capisce a quale ramo vanno i tuoi dcommit cercando il tip di uno dei tuoi rami di Subversion nella tua storia - dovresti averne solo uno, e dovrebbe essere l'ultimo con un git-svn-id nella cronologia attuale del tuo ramo. " https://git-scm.com/book/en/v2/Git-and-Other-Systems-Git-as-a-Client#switching-active-branches-LPtGtkszIW – jgomo3

1

modo semplice se si desidera dcommit maestro git in tronco svn, provare i seguenti comandi:

git checkout master 
git rebase trunk 
git svn info # To verify that you're on the right branch 
git svn dcommit 

lo stesso quando sull'altro ramo (ad es 6.x)

git checkout 6.x 
git rebase 6.x # or git rebase remotes/6.x 
git svn info 
git svn dcommit 
Problemi correlati