git-svn avait un grave problème lié à commits cueillies cerises:
Supposons que vous ayez commettre a1b2c3f9 qui est déjà dcommitted dans le référentiel 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-...
Voir ce git-svn-id ligne? C'est ainsi que git-svn comprend où votre commit se trouve dans le dépôt Subversion.
Maintenant, vous voulez écrémer le présent engage à maître branche vous êtes actuellement sur:
$ git cherry-pick a1b2c3f9
S'il n'y avait pas de conflit de fusion, git crée un commit, disons, 9f3c2b1a et voici ce que nous avons:
$ 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-...
Donc, Git a créé un commit avec exactement le même message. Cela a causé de sérieux problèmes. Les anciennes versions de git-svn ont envoyé un tel commit dans la mauvaise branche - ^/branches/certaines branches au lieu de ^/trunk/.
Ce problème est déjà résolu dans les dernières versions de Git. Mais il en existe un autre qui est toujours présent:
git-svn ne respecte pas le mécanisme de suivi de fusion de Subversion.
pistes Subversion fusion des informations sur les choix de cerise effectuées, de sorte que la commande
$ svn merge -c 1000 ^/branches/some-branch trunk-working-copy
permet de régler la svn: mergeinfo propriété de coffre-travail-copie comme suit:
+ /branches/some-branch: 1000
De cette façon, Subversion comprend que cette révision particulière a déjà été fusionnée en ^/trunk/ branche donc il saute ce changement e dans d'autres fusions.
Lorsque vous exécutez git cherry-pick
puis git svn dcommit
dépôt Subversion ne soit pas svn: mergeinfo modification.
va ici l'avertissement:
Actuellement je ne travaille pas sur SmartGit mais je travaille dans un contact étroit avec les développeurs SmartGit.
société Syntevo développé SmartGit - un remplacement de git-svn. Ce client Git résout tous les problèmes que je viens de décrire ci-dessus:
Alors, vous écrémer le a1b2c3f9 commettras:
$ git cherry-pick a1b2c3f9
comme résultat que vous obtenez 9f3c2b1a commettras, puis vous pousser dans Référentiel Subversion. SmartGit fait tout pour conserver les informations de fusion de suivi, de sorte ^/tronc/ branche obtient la modification nécessaire de son svn: mergeinfo propriété:
+ /branches/some-branch: 1000
Vous pouvez effectuer écrémer le Git soit à partir SmartGit lui-même ou à l'aide Interface de ligne de commande Git. Dans le second cas, le message de validation doit avoir git-svn-id ligne de la source de sélection de cerise. SmartGit est un logiciel propriétaire, mais il est gratuit pour une utilisation non commerciale. Il a beaucoup de grandes fonctionnalités, pour plus d'informations s'il vous plaît se référer à SmartGit documentation. Il existe un autre projet intéressant qui résout certains problèmes avec git-svn - SubGit. Fondamentalement, c'est la solution côté serveur pour synchroniser les changements entre les dépôts Subversion et Git. C'est beaucoup plus supérieur que git-svn et n'a pas ses problèmes.
En tant qu'utilisateur svn-via-git, je crois que cela vous intéressera peut-être aussi.
J'utilise TortoiseSVN, donc je ne sais pas comment vous le feriez en ligne de commande, mais je recommanderais de faire ce que l'on appelle dans Tortoise Recording the Merge, où vous mettez à jour le mergeinfo, mais ne faites rien changements réels dans le commit. Cela éviterait théoriquement d'autres problèmes si d'autres personnes fusionnent dans le contexte SVN, puisque ces révisions ont déjà été «fusionnées» et pourraient provoquer un faux conflit. –