2009-07-10 7 views
3

J'ai un contrôle git-svn de tout mon repo (initialisé dans la mode standard git svn init -t tags -b branches -T trunk $repo_url, puis git svn fetch ed). J'ai manuellement svn copy $repo_url/branches/branch1 $repo_url/branches/branch2. J'ai alors couru git svn fetch, git checkout -b local-branch2 branch2, fait quelques commits à branch2, dcommit les ai édités de nouveau au dépôt SVN, et suis fait avec mon travail sur branch2. (Pourquoi branchez une branche? Je voulais pirater cette branche localement en git, mais je m'engage toujours à SVN et je reçois de l'aide de quelques collègues pendant que je travaillais dessus).git-svn: comment copier les commit git d'une branche SVN à une autre?

Ce que je n'ai pas fait est de fusionner le travail branch2 en branch1. Si je git checkout -b local-branch1 branch1, puis git merge branch2, il simplement avance mon pointeur local-branch1 à où branch2 est.

Au lieu de cela, je veux que git rejoue tous les commits faits depuis le début branch2 sur branch1, de sorte que je puisse les commettre chacun sur le repo SVN. Il semble qu'il y ait un moyen de le faire, mais je ne peux pas y penser. Peut-être git rebase, ou un git cherry-pick de chaque validation faite sur branch2? (bien que ce dernier est un peu fastidieux). Je préfère ne pas svn fusionner les deux URL ensemble, car c'est un gros seau de mal.

Des idées? Toutes les parties de ce besoin de plus d'explications?

+0

* "Pourquoi créer une branche?" * Parce que git. Oui. – naught101

Répondre

6

Le premier commit sur branch2 qui n'est pas sur local-branch1 est probablement le commit qui a créé branch2, oui? Cela devrait apparaître comme une validation vide dans git (par exemple un message, mais pas de contenu). Copiez son identifiant sha1. Ensuite, dans local-branch1, essayez git reset --hard branch2 && git rebase --onto [email protected]{1} SHA1 (où SHA1 est le sha1 copié). Cela devrait rejouer tous les commits, sauf celui qui est vide sur la branche 1. Vous voudrez probablement maintenant faire un rebasage interactif et éditer chaque commit pour pouvoir supprimer la ligne git-svn-id: que git-svn ajoute pour vous (ou vous pouvez écrire un script git-filter-branch pour le faire, s'il y a suffisamment de commits). Par curiosité, pourquoi voulez-vous relire chacun des commits? Si vous voulez simplement fusionner vos changements, c'est beaucoup plus simple, vous pouvez simplement faire git checkout local-branch1 && git merge --squash branch2 && git commit. Cela fera une fusion non-forward-forward, mais il ne produira pas réellement un commit de fusion (car ceux-ci confondent git-svn). Au lieu de cela, il produira l'arbre de travail équivalent comme si une fusion s'était produite, mais avec un seul parent. Cela reflète le fonctionnement de svn merges.

+0

On dirait que tout a fonctionné, merci. Je ne voulais pas faire le commit de squash, parce que je voulais conserver chaque commit dans le repo (diffs et commettre des messages) au cas où je devrais régresser quelque chose plus tard. Je peux repenser cette approche la prochaine fois que je dois faire ceci, parce que c'est un peu brouillon. – cbowns

+0

De plus, un ami vient de le faire pour moi: git-svn préfère maintenant ignorer les lignes git-svn-id existantes dans les messages de validation et ne se déconnectera pas de la mauvaise branche. – cbowns

+0

Après avoir fait quelques commits de plus, 'git svn info' m'a encore montré sur la mauvaise branche pour dcommitting (il m'a eu sur branche2). J'ai sélectionné et remis à zéro mon chemin vers la branche 1, puis j'ai fait un 'git checkout master '; git reset --hard branch1' pour récupérer le master là où je le voulais. – cbowns