2010-12-13 13 views
9

Sto affrontando il problema di unire un sottoinsieme di revisioni da un ramo argomento all'altro. Dal momento che sto usando git-svn, ero curioso di vedere se è possibile usare il cherry-picking per questo. Usando Subversion, vorrei fare:cherry-picking con git-svn

svn merge -c A 
svn merge -c B 
svn merge -c C 
... 
svn commit ... 

cosa succederà se provo a farlo?

git checkout branch1 
git cherry-pick A 
git cherry-pick B 
git cherry-pick C 
git svn dcommit 

Se ho letto la pagina man git svn, le risposte è "non farlo", ma ho l'impressione quando googling in giro che svn git fa un lavoro molto meglio ora con questi tipi di problemi .

risposta

8

Quando si esegue git svn dcommit, eseguirà in sequenza uno svn commit per ogni commit Git tra il proprio ramo di tracciamento SVN e qualunque cosa sia HEAD in git. Nel tuo esempio, questo è tre commit – uno per A, B e C – poiché git cherry-pick commette immediatamente le modifiche. Concesso, è possibile utilizzare git rebase -i per suddividere questi commit in un'unica revisione prima di eseguire git svn dcommit per inviarli a svn.

L'esecuzione di git-svn ignora completamente tutte le proprietà svn:mergeinfo. Da git-svn man page:

Ignoriamo tutte le proprietà SVN tranne svn: eseguibile. Qualsiasi proprietà non gestite vengono registrati $GIT_DIR/svn/<refname>/unhandled.log

+0

Uso TortoiseSVN, quindi non sono sicuro di come lo faresti sulla riga di comando, ma ti consiglio di fare ciò che in Tortoise si chiama Recording the Merge, dove aggiorni mergeinfo, ma non creare alcun modifiche effettive nel commit. Ciò teoricamente impedirebbe ulteriori problemi se altre persone si fondessero all'interno del contesto SVN, dal momento che tali revisioni sono già state "unite" e potrebbero causare un falso conflitto. –

1

Non ci dovrebbero essere problemi con questo affatto; L'ho già fatto molte volte al lavoro prima. Inoltre, quando TortoiseSVN ha avuto problemi a fondere interi rami in passato, ho fatto ricorso a ribasare i rami degli argomenti in cima al tronco e schiacciare tutti i commit in un commit, che è simile per natura a un cherry-pick. Ha funzionato alla grande.

+0

Ma git svn aggiorna svn: mergeinfo correttamente le proprietà in modo che le operazioni di unione di operazioni successive eseguite con svn merge "vedono" i cherry-pick? – JesperE

+0

@JesperE: No. Per il mio lavoro non mi interessa, perché svn: mergeinfo è un hack terribile, e io uso Git per eseguire comunque le unioni. :) – cdhowie

+0

Sì, svn: mergeinfo è un terribile hack, ma sfortunatamente non ho quel lusso. I miei colleghi sarebbero piuttosto seccati se lo facessi. – JesperE

9

git-svn avevano un problema serio relative al commit ciliegia-raccolto:

Supponiamo di avere commettere a1b2c3f9 che è già dcommitted in repository svn:

$ git show a1b2c3f9 
    commit a1b2c3f9... 
    Author: Happy Dev <[email protected]> 
    Date: Mon Nov 14 13:01:38 2011 +0000 

    Commit message 

    git-svn-id: https://host/svn/branches/[email protected] 43fe5c0-... 

Vedere questo git-svn-id linea? Questo è il modo in cui git-svn capisce dove si trova il commit nel repository di Subversion.

Ora si vuole cherry-pick questa impegnano a maestro ramo si Attualmente sei su:

$ git cherry-pick a1b2c3f9 

Se non ci fossero conflitti di unione, git crea un nuovo impegno, diciamo, 9f3c2b1a e ecco cosa abbiamo:

$ git show 9f3c2b1a 
    commit 9f3c2b1a... 
    Author: Happy Dev <[email protected]> 
    Date: Mon Nov 14 13:01:39 2011 +0000 

    Commit message 

    git-svn-id: https://host/svn/branches/[email protected] 43fe5c0-... 

Quindi, Git ha creato un commit con esattamente lo stesso messaggio. Ciò ha causato seri problemi. Le versioni precedenti di git-svn inviavano tale commit nel ramo errato - ^/branches/some-branch anziché ^/trunk/.

Questo problema è già stato risolto nelle ultime versioni di Git. Ma ce n'è un altro ancora presente:

git-svn non rispetta il meccanismo di tracciatura unione di Subversion.

tracce di Subversion si fondono le informazioni sul eseguite ciliegia-picks, quindi il comando

$ svn merge -c 1000 ^/branches/some-branch trunk-working-copy 

regola il svn: mergeinfo proprietà di tronco-lavoro-copia come segue:

+ /branches/some-branch: 1000 

In questo modo Subversion capisce che questa particolare revisione era già stata incorporata nel ramo ^/trunk/ così salta questo cambiamento e in ulteriori fusioni.

Quando si esegue git cherry-pick e poi git svn dcommit repository Subversion non ottiene svn: mergeinfo modifica.


Qui va il disclaimer:
Attualmente non lavoro su SmartGit ma io lavoro a stretto contatto con gli sviluppatori SmartGit.

Syntevo azienda ha sviluppato SmartGit - un ottimo sostituto di git-svn. Questo client Git risolve tutti i problemi che ho descritto sopra:

Così, cherry-pick a1b2c3f9 commit:

$ git cherry-pick a1b2c3f9 

come risultato che si ottiene 9f3c2b1a commit, e poi spingere in Repository di Subversion. SmartGit fa di tutto per mantenere le informazioni merge-tracking, in modo ^/trunk/ ramo diventa necessaria modifica del suo svn: mergeinfo proprietà:

+ /branches/some-branch: 1000 

È possibile eseguire Git cherry-pick sia da SmartGit stesso oppure utilizzando Interfaccia a riga di comando Git. Nel secondo caso, il messaggio di commit deve avere la riga git-svn-id dell'origine cherry-pick.

SmartGit è un software proprietario, ma è gratuito per uso non commerciale. Ha un sacco di grandi caratteristiche, per ulteriori informazioni si prega di fare riferimento a SmartGit documentation.

C'è un altro progetto interessante che risolve determinati problemi con git-svn - SubGit. Fondamentalmente è la soluzione lato server per sincronizzare le modifiche tra i repository di Subversion e Git. È molto più superiore di git-svn e non ha i suoi problemi.

Come utente svn-via-git, credo, si potrebbe essere interessati a che troppo.

+0

Grazie per l'informazione. Sembra promettente. – JesperE

+0

> È molto più superiore di git-svn e non ha i suoi problemi. Questo è quanto affermato nel sito Web di SubGit, ma non riesco a trovare nulla in dettaglio di ciò che sono in grado di fare e di come gestiscono le differenze strutturali. – Peter