2010-09-05 3 views
0

Fondamentalement, quand je veux commettre deux changements séparés dans le même fichier qui résultent d'une opération git add --patch <file>, git svn rebase lance plus tard 1-2 conflits en validant le second changez en utilisant git add pour le deuxième changement.Problème de git-svn avec git add --patch entraînant des conflits

donc je fais essentiellement ceci (je suis sur la branche principale et avoir récupéré le dépôt svn):

git checkout -b feature 
... make two unrelated changes to file test.txt... 
git add --patch test.txt 
... add first change but ignore second one 
git commit -m "change1" 
git stash 
git checkout master 
git merge feature 
git svn rebase 
git svn dcommit 
git checkout feature 
git stash apply 

maintenant ici il y a deux façons de le faire, d'abord celui qui fonctionne:

git add --patch test.txt 
... select everything (which is the second change in this case) 
git commit -m "change 2" 
git checkout master 
git merge feature 
git svn rebase 
git svn dcommit 

est ici celui qui ne fonctionne pas:

git add test.txt #notice there's no --patch 
git commit -m "change 2" 
git checkout master 
git merge feature 
git svn rebase #yields a conflict 

Alors, pourquoi est-ce que lors de l'utilisation git add --patch pour le deuxième changement, je peux commettre au dépôt svn sans problèmes, mais en utilisant simplement git add pour le deuxième changement, il en résulte un conflit? Je suis assez nouveau à git, donc c'est peut-être une question stupide, mais comme je le vois, les deux sets de commandes devraient faire exactement la même chose.

Répondre

1

Pourquoi créez-vous une branche pour vos 2 validations, puis revenez en arrière? Je suppose que cela pourrait causer des problèmes, car fusionner dans git fonctionne différemment de comment ils fonctionnent dans svn.

cela devrait fonctionner ("devrait", mais je suis sûr qu'il fait):

# on master, no need to create a branch 
$ git add -p file 
$ git commit -m "first set of changes" 
$ git add file 
$ git commit -m "the remaining changes" 
# apply your commit on top of eventually new changes upstream 
$ git svn rebase 
# commit your 2 commits to svn 
$ git svn dcommit 

dans les branches svn ne sont que des copies d'un répertoire (le plus souvent le répertoire du tronc), et fusion commits ne diffèrent pas de commits normales (à l'exception de la nouvelle propriété svn:mergeinfo commence avec svn 1.6)

commits git sont différentes, chaque livraison stocke un lien vers ce engageons-parent. svn n'en a pas besoin, car il peut simplement utiliser REV-1. les commits de fusion dans git ont donc plusieurs parents (la branche fusionnée et la branche fusionnée)

Je ne sais pas ce qui se passe si vous dgommettez un git à svn, mais il ne commettra probablement que le commit de fusion lui-même, sans historique (message lorsque vous exécutez svn commit, seules vos nouvelles modifications sont envoyées au serveur pour économiser de la bande passante. Maintenant, les fusions dans git fonctionnent différemment et la différence par rapport aux versions précédentes sera probablement pas être ce que vous attendez,

il le dit même dans la documentation git svn: ne pas fusionner les branches en utilisant g et les dcommit à svn, il sera très probablement gâcher votre histoire

Exécution git merge ou git pull est pas recommandé sur une branche que vous envisagez de partir dcommit. Subversion ne représente pas des fusions de toute manière utile ou utile; donc les utilisateurs utilisant Subversion ne peuvent pas voir les fusions que vous avez faites. En outre, si vous fusionnez ou tirez d'une branche git qui est un miroir d'une branche SVN, dcommit peut s'engager dans la mauvaise branche. git svn docs

+0

http://andy.delcambre.com/2008/03/04/git-svn-workflow.html J'ai suivi ce tutoriel (je suis assez nouveau pour git) et il dit qu'il est pas recommandé de travailler sur la branche maîtresse. Je l'ai essayé sur master (pas exactement comme tu veux, car je veux être deux rebase/dcommit à svn) et ça a marché sans problème. Cela vous dérangerait-il d'expliquer la différence entre une fusion svn et git, ce serait grandement apprécié? – Zenon

+0

@Zenon: je ne comprends pas votre »je veux être deux rebase/dcommit à svn«? peux-tu élaborer? – knittl

+0

oh je voulais dire que j'ai fait le premier changement -> svn rebase & svn dcommit, puis j'ai caché le 2ème changement et svn rebase & svn dcommit à nouveau. J'ai essentiellement fait le tout comme une sorte de preuve de concept. Par exemple, je travaille sur une branche dans git pour ajouter de nouveaux trucs et juste pour les supprimer, certains des changements n'étant pas liés. Plus tard, je veux vérifier l'une des choses que j'ai ajoutées à master et ensuite à svn, puis continuer à travailler sur les autres changements dans la branche git et les soumettre plus tard quand ils ont terminé. De cette façon, vous n'aurez pas à vous soucier du contrôle de la source lors du codage. – Zenon

Questions connexes