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
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.
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.
Retirez les patchs locaux indésirables de "maître" avec un rebasage:
git rebase -i HEAD~10
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:
Tirez les modifications non validées de retour à la branche « maître » à l'aide
git cherry-pick
et enfin enlever la branche inutile avecgit branch -d wip
.
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:
- 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à.
- 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.
J'ai suivi ici la procédure:
http://fredericiana.com/2009/12/31/partial-svn-dcommit-with-git/
Si vous êtes rebasage confortable, cela fonctionne assez bien.
- 1. Comment faire pour que git-svn utilise une branche svn particulière en tant que dépôt distant?
- 2. SVN Mot-clé personnalisé Patches
- 3. Comment faire pour gérer les fichiers de projet IDE avec git-svn
- 4. Est-ce que Git-Svn Store Svn passe?
- 5. Comment tromper git-svn pour reconnaître les fusions faites avec svn?
- 6. Faire fonctionner git-svn sur Slackware 12.1
- 7. svn fusionner avec révision ne pas faire ce que j'attends
- 8. Cloner plusieurs projets SVN avec git-svn
- 9. Puis-je faire en sorte que git-svn ressemble plus à git?
- 10. git-svn: comment copier les commit git d'une branche SVN à une autre?
- 11. Faire face à l'expansion de mot-clé SVN avec git-svn
- 12. Git SVN ne récupère rien occasionnellement
- 13. git svn clone ne vérifie pas tous les répertoires
- 14. Puis-je faire 'git svn dcommit' à partir d'un clon git SVN qui a été créé avec --no-metadata?
- 15. SVN à git ... maintenant git à SVN. Tant de conflits
- 16. Comment faire pour valider l'installation ASPNET AJAX
- 17. Git format-patch pour être compatible svn?
- 18. Git svn rebase échoue
- 19. détecter les conflits après git-svn rebase
- 20. Comment valider un repo Git sur un serveur SVN repo vide?
- 21. jQuery sélectionnable: Comment faire les éléments sélectionnés au 1er chargement
- 22. Comment appliquer SVN diff à Git?
- 23. git-svn pas une commande git?
- 24. flux de travail git pour faire des modifications que vous ne pousserez jamais à l'origine
- 25. git-svn dcommiter un seul commit git
- 26. git: Changer de branche et ignorer les modifications sans valider
- 27. Combiner les commandes Git locales dans un commit pour git-svn
- 28. Puis-je faire git-svn importer un dépôt Subversion qui lui-même contient des dépôts git
- 29. git-svn fusionne et commente
- 30. Conversion svn en git, comment obtenir les branches ne pas être juste à distance dans le svn repo?
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. –
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". –