Почему git-svn dcommit оставляет дублирующие коммиты в моем git-репо? Могу ли я остановить это, делая это? - PullRequest
7 голосов
/ 01 июня 2009

Мой типичный рабочий процесс git-svn:

git checkout -b story-xyz
git commit -a -m "work"
git commit -a -m "more work"
git checkout master
git svn fetch
git merge remotes/trunk
git checkout story-xyz
git rebase master (sometimes with -i)
git checkout master
git merge story-xyz

На данный момент мои ветви master и story-xyz указывают на один и тот же коммит, один или несколько коммитов перед remotes/trunk. Все, начиная с remotes/trunk, находится в одной линейной истории.

last svn commit [remotes/trunk] <--- work <--- more work [master, story-xyz]

Я тогда бегу

git svn dcommit

Я ожидал, что коммиты между remotes/trunk и master станут ревизиями Subversion и в итоге получат одну линейную историю, в которой remotes/trunk, master и story-xyz все указывают на последнюю ревизию, как :

last svn commit <--- work <--- more work [master, story-xyz, remotes/trunk]

Мои ревизии Subversion проходят нормально, но в итоге я получаю двухразветвленную структуру. Общий корень ветки - это Subversion HEAD до того, как я его зафиксировал. Обе ветви содержат одинаковые серии коммитов в том смысле, что они содержат одинаковые различия. Ветвь story-xyz находится во главе одной ветви, remotes/trunk и master в другой:

last svn commit <--- work <--- more work [master, remotes/trunk]
                  |
                  \- work <--- more work [story-xyz]

Git коммиты, которые у меня были до запуска git svn dcommit, находятся в нижней ветви (story-xyz), с моими сообщениями git commit, именем пользователя git и электронной почтой, а также временными метками git commit. Коммиты на верхней ветке - это новые коммиты git. Они используют мое имя пользователя Subversion, отметку времени, когда я запустил dcommit, и к сообщениям о фиксации добавлено поле git-svn-id.

Все в порядке, и я могу продолжать работать. Проблема в том, что я смотрю в gitk и вижу что-то похожее на неотправленную ветку story-xyz. Довольно сложно отличить ветвь истории, которую я слил обратно в master, и ветвь, которой я не сделал. Самый очевидный способ определить это - дублировать сообщения коммита. Я мог бы удалить ветку story-xyz, но мне кажется, что я не использую git должным образом, и я потерял часть своей истории.

Я что-то упускаю, что остановит git-svn от этого? Или это только один из способов, которыми взаимодействие с Subversion ослабляет силу и свободу мерзавца?

1 Ответ

4 голосов
/ 01 июня 2009

Не думаю, что вы действительно ничего не упустили. Вы, возможно, делаете некоторую ненужную работу, хотя. В этом случае у вас есть два указателя на коммит «дополнительная работа», и вы просите git-svn переместить один из них. Другой все еще остается там, где он есть.

Вам действительно не нужна ветка master. Git-svn не заботится о том, какую ветку вы используете. IIRC использует первый svn-remote, который он может найти среди предков текущего коммита.

Я предложу другую версию рабочего процесса:

git checkout -b story-xyz remotes/trunk
git commit -a -m "work"
git commit -a -m "more work"
git svn fetch
git rebase remotes/trunk (with -i, perhaps)
git svn dcommit

Это должно дать вам дерево без лишней ветви. Вы должны быть осторожны с ускоренным слиянием.

...