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.
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. –