git-svn проблема с git add --patch, приводящая к конфликтам - PullRequest
0 голосов
/ 05 сентября 2010

В основном, когда я хочу зафиксировать два отдельных изменения в одном и том же файле, которые возникли в результате операции git add --patch <file>, git svn rebase позже выдает 1-2 конфликта при внесении второго изменения при использовании git add для второго изменения.

так что я в основном делаю это (я на главной ветке и получил 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

теперь здесь есть два способа сделать это, первый, который работает:

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

вот тот, который не работает:

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

Так почему же при использовании git add --patch для второго изменения я могу без проблем зафиксировать хранилище svn, но при использовании git add для второго изменения это приводит к конфликту? Я совершенно новичок в git, так что это может быть глупым вопросом, но, как я понимаю, оба набора команд должны работать одинаково.

1 Ответ

1 голос
/ 05 сентября 2010

почему вы создаете ветку для ваших 2 коммитов, а затем объединяетесь?Я думаю, это может создать проблемы, так как слияния в git работают иначе, чем в svn.

это должно работать ("следует", но я уверен, что это так):

# 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

в ветвях svn - это просто копии каталога (чаще всего это магистральный каталог), и коммиты слияния не отличаются от обычных коммитов (за исключением нового свойства svn:mergeinfo, начинающегося с svn 1.6)

коммиты в git разные, каждый коммит хранит ссылку на свой родительский коммит.SVN не нуждается в этом, поскольку он может просто использовать REV-1.Коммиты слияния в git, таким образом, имеют несколько родителей (ветвь слияния и ветвь слияния)

Я не знаю, что произойдет, если вы передадите git в svn, но он, вероятно, будет только фиксировать коммит слияния сам, без истории(сообщение выглядит как «объединенная ветвь« bla »в« master »).

когда вы запускаете svn commit только ваши новые изменения отправляются на сервер для экономии пропускной способности. теперь слияния в git работают по-другому иразница с предыдущими версиями, вероятно, не будет такой, как вы ожидаете, поэтому git svn dcommit терпит неудачу.

в документации git svn говорится даже так: не объединяйте ветки с помощью git и не делайте их в svnэто, скорее всего, испортит вашу историю

Запуск git merge или git pull НЕ рекомендуется в ветке, из которой вы планируете dcommit. Subversion не представляет слияния каким-либо разумным или полезным способом, поэтому пользователииспользуя Subversion, вы не увидите никаких сделанных вами слияний. Более того, если вы слили или извлекли из ветки git, которая являетсязеркало ветки SVN, dcommit может зафиксировать неправильную ветку. git svn docs

...