2010-12-13 8 views
9

Je suis confronté au problème de la fusion d'un sous-ensemble de révisions d'une branche de sujet à l'autre. Depuis que j'utilise git-svn, j'étais curieux de voir s'il est possible d'utiliser le ceris-picking pour cela. En utilisant Subversion, je ferais:cherry-picking avec git-svn

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

ce qui se passera si j'essaye de faire ceci?

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

Si je lis le svn git homme pages, les réponses est « ne pas faire », mais j'ai l'impression quand googler autour de cette svn git fait un travail beaucoup mieux maintenant avec ce genre de questions .

Répondre

8

Lorsque vous faites git svn dcommit, il exécutera séquentiellement un svn commit pour chaque commit git entre votre branche de suivi svn et ce que HEAD est en git. Dans votre exemple, il s'agit de trois validations – chacune pour A, B et C – puisque git cherry-pick valide les modifications immédiatement. Accordé, vous pouvez utiliser git rebase -i pour écraser ces commits ensemble dans une seule révision avant d'exécuter git svn dcommit pour les pousser à svn. L'exécution git-svn ignore complètement toutes les propriétés svn:mergeinfo. À partir de git-svn man page:

Nous ignorons toutes les propriétés SVN à l'exception de svn: exécutable. Toutes les propriétés non gérées sont enregistrées à $GIT_DIR/svn/<refname>/unhandled.log

+0

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

1

Cela ne devrait poser aucun problème; Je l'ai fait plusieurs fois au travail avant. De plus, quand TortoiseSVN a eu du mal à fusionner des branches entières dans le passé, j'ai recomposé des branches de sujet sur le tronc et écrasé tous les commits en un seul commit, ce qui est similaire à un choix de cerise. Ça a bien marché.

+0

Mais gn svn mettra-t-il à jour les propriétés svn: mergeinfo correctement pour que les opérations de fusion de sous-séquence faites avec svn merge "voient" les sélections de cerises? – JesperE

+0

@JesperE: Non. Pour mon travail, cela m'est égal, car svn: mergeinfo est un hack terrible, et j'utilise Git pour effectuer des fusions quand même. :) – cdhowie

+0

Oui, svn: mergeinfo est un hack terrible, mais malheureusement, je n'ai pas ce luxe. Mes collègues seraient ennuyés si je faisais ça. – JesperE

9

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.

+0

Merci pour l'information. Cela semble prometteur. – JesperE

+0

> C'est beaucoup plus supérieur à git-svn et n'a pas ses problèmes. Ceci est revendiqué partout sur le site Web de SubGit, mais je ne peux rien trouver dans le détail ce qu'ils sont capables de faire et comment ils gèrent les différences structurelles. – Peter

Questions connexes