2009-06-10 6 views
9

J'ai un certain nombre de correctifs localement engagés dans mon repo git-svn que je n'ai pas encore engagé dans notre repo svn. Un "git svn dcommit" normal va commettre tous ces patches sur svn. Je ne souhaite valider que certains de mes correctifs (corrections de bugs simples), mais pas d'autres (changements majeurs non testés). Comment puis-je faire cela avec git svn?Comment faire pour ne valider que les patches sélectionnés avec git svn?

Répondre

5

Voici ce que j'ai fini par faire. Le point de départ est la branche "master" synchronisée avec svn, avec tous mes patches locaux en haut.

  1. Créer une nouvelle branche (wip = Work In Progress).

    git branch wip 
    

    Cela fait une copie de la branche en cours, y compris tous les correctifs non encore validés par svn. La branche actuelle restera comme "maître" et ne sera pas modifiée.

  2. Retirez les patchs locaux indésirables de "maître" avec un rebasage:

    git rebase -i HEAD~10 
    
  3. Maintenant, la branche "maître" a des taches que vous pouvez en toute sécurité commit:

    git svn dcommit 
    

    Le "WIP" branche a maintenant les changements majeurs qui ne sont pas encore prêts pour le partage. En fait, je veux qu'ils restent là et c'est là que j'arrêterais. Il est possible de faire le svn dcommit depuis la branche "wip" une fois que tout est finalisé. Mais pour l'amour de completess', et de répondre à la question initiale, il y a une dernière étape:

  4. Tirez les modifications non validées de retour à la branche « maître » à l'aide git cherry-pick et enfin enlever la branche inutile avec git branch -d wip.

+0

La dernière étape ici est "git pull.wip" qui tire juste dans tous les changements de la branche wip, pour satisfaire la question initiale, l'utilisation de git-cherry-pick serait nécessaire. –

+0

Mark, merci de l'avoir signalé; J'ai modifié la publication pour utiliser la sélection de cerises à la place. L'utilisation de "git pull.wip" suivi de "git svn rebase" résoudra généralement automatiquement les conflits, mais il est préférable d'utiliser le "ceris-pick". –

2

Avec git, vous n'êtes pas supposé opérer sur des changesets uniques. La meilleure approche que je connais est de créer des branches locales pour tout travail non trivial. De cette façon, vos modifications majeures non testées se retrouveront dans différentes branches de votre dépôt git, et vous pourrez les différencier assez facilement.

Si c'est le problème que vous avez actuellement, vous pouvez probablement créer une nouvelle branche à partir du dernier point mis à jour depuis svn et ensuite utiliser git-cherry-pick pour transférer vos corrections de bugs simples à cette nouvelle branche, à partir de laquelle dcommit à svn.

D'un point à long terme de vue, il est préférable d'avoir votre propre branche « maître » fait à partir du tronc de la subversion, puis:

  1. rebasage toutes vos branches à chaque fois que vous mettez à jour à partir svn, puis fusionnez ceux que vous voulez envoyer à svn à votre maître et démarrez à partir de là.
  2. Fusionnez des éléments de svn en utilisant le git-merge standard, puis fusionnez les éléments à votre maître pour les dcommits par git diff ..my_branch | patch -p1, ce qui élimine l'historique que git-svn ne peut pas gérer. Cette approche est plus compliquée pour la fusion finale mais vous permet de fusionner des choses entre les branches (et peut-être d'autres personnes) dans git lui-même.
Questions connexes