2009-09-11 8 views

Répondre

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

+0

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

+0

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

+0

@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é? –

17

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)

+0

c'est totalement cool, cela change complètement mon flux de travail, merci beaucoup –

3

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   *---*---*---*---* 
3

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. 
+2

Assurez-vous d'ajouter de nouveaux fichiers. "git commit -am" n'ajoute pas de nouveaux fichiers par lui-même. –

+0

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

0

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

Questions connexes