Actuellement, lorsque j'exécute git svn dcommit
git crée une validation distincte dans SVN pour chaque validation locale que j'ai faite depuis la dernière synchronisation avec SVN. Est-il possible pour dcommit
à la place de combiner toutes mes récentes validations locales dans un commit pour SVN?Combiner les commandes Git locales dans un commit pour git-svn
Répondre
git rebase remotes/trunk --interactive
devrait vous apporter au menu où vous pouvez choisir commits ou les courges tout en 1 engagement afin d'éviter de polluer votre dépôt svn. This est une très bonne ressource (mais courte) sur le travail avec git-svn.
Non, mais vous pouvez facilement faire passer tous les commits ensemble. Pour l'exemple suivant, je vais supposer que vous êtes sur la branche master
correspondant à la branche trunk
à distance et que vous voulez écraser les commits locaux ensemble:
git tag local # create a temporary tag
git reset --hard trunk
git merge --squash local
git commit # write your single commit message here
git svn dcommit
git tag -d local # delete the temporary tag named local
Au lieu d'utiliser une étiquette temporaire que vous pourriez aussi utiliser la reflog (c.-à-utiliser [email protected]{1}
en place de local
)
c'est totalement cool, cela change complètement mon flux de travail, merci beaucoup –
Cela a fonctionné pour moi - écrasements plusieurs commits en un seul commettre et dcommitted à svn:
http://www.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html
Lorsque je travaille avec git-svn et que je souhaite qu'une série de validations git apparaisse en tant que validation unique, je travaille sur une branche de sujet, puis exécute un merge
non-fast-forward dans master avant dcommit
-ing.
D'abord, rebasage votre branche contre svn et assurez-vous que maître local est à jour:
git svn rebase && git push . remotes/trunk:master
Passez ensuite au maître, de fusion et dcommit:
git checkout master
git merge <branch> --no-ff -m "Message you want in svn"
git svn dcommit
Cela affichera en tant que commit unique dans Subversion mais vous aurez toujours votre historique local qui vous a amené à ce commit.
+--- Merge commit
V
svn trunk *---*---*-------------------*--- --- ---
\ /
topic branch *---*---*---*---*
Une façon plus simple pourrait être (si vous avez plusieurs commits empilés sur votre système local):
git reset <hash tag of commit till which u need to combine>
git commit -am "your message" // This will create one clubbed commit of all the commit till the hash tag used.
Assurez-vous d'ajouter de nouveaux fichiers. "git commit -am" n'ajoute pas de nouveaux fichiers par lui-même. –
Alternativement, en utilisant reset --soft laissera les changements tous les étapes afin que vous n'avez pas besoin de vous soucier d'ajouter des fichiers ou en utilisant -a. – PeterJCLaw
qui ne fonctionne pas pour moi. J'utilise merge --no-ff --no-commit
mais après commets, je suis arrivé:
svntrunk 54f35e4 [trunk: ahead 336] release 1
dcommitting à trunkwill engager tous les 336 commits.
réinitialisation, le marquage et l'écrasement comme décrit dans la réponse n ° 2: Combine local Git commits into one commit for git-svn fonctionnera, mais à la prochaine "fusion" vous aurez du mal à obtenir tous les commits ensemble à nouveau!
le seul et unique qui travaille pour moi:
git checkout -tb svntrunk remotes/trunk
git merge --no-commit --squash master
pour obtenir tous les commits de maître à svn sans perdre l'histoire pour la future fusion avec la même commande
~ Marcel
Cela semble comme une très bonne solution. Je ne comprends pas quel est l'effet des télécommandes/tronc dans la commande, le résultat final est que tous mes commits sont écrasés à l'intérieur du maître. J'espérais qu'ils seraient seulement écrasés en envoyant à SVN. Il est nécessaire de s'engager à SVN après l'écrasement. –
@MacRae Linton: Tous vos engagements doivent être écrasés en maître. S'ils n'étaient pas git, ils n'auraient aucun moyen de synchroniser les dépôts git et svn. Quand vous rebassez pour tirer les dernières modifications svn aurait un commit mais dans git vous auriez n commits. –
@Jason Punyon: Le problème que je rencontre est qu'après avoir écrasé les commits en master, il devient difficile de fusionner à nouveau ma branche avec ma branche en développement. À peu près tous mes changements deviennent des conflits de fusion, ce qui est une énorme douleur à traiter. Est-ce une conséquence inévitable de garder ma branche en développement séparée du maître écrasé? –