У меня проблема с git-svn dcommit, из-за которой репозиторий git не отслеживает, какие коммиты есть какие.
] Я стараюсь следить за тем, чтобы ветвь master в git всегда следовала за основной веткой в репозитории SVN. Поэтому всякий раз, когда я работаю, я нахожусь в тематической ветке. Вот мой сценарий:
Некоторое время работаю в тематической ветке
git checkout -b my-topic
git commit -m "blah blah blah"
Затем я решаю, что хочу снова объединить свою ветку с мастером
git checkout master
git svn rebase #get any changes in svn
git rebase master my-topic
git merge my-topic --ff-only
До сих пор все шло хорошо. Теперь у меня есть и master, и my-topic, и они указывают на одну и ту же фиксацию, а вся история выглядит так:
A -- B -- C - master + my-topic
Однако, когда я делаю
git svn dcommit
, я получаю дерево, которое выглядит следующим образом (B и C - это коммиты, которые я изначально сделал в теме):
-- B -- C - my-topic
/
A -- B -- C - master + remotes/trunk
Похоже, что во время процесса dcommit git подталкивает коммиты до SVN, затем воспроизводит их снова поверх мастера. Я думаю, проблема в том, что они получают разную информацию о коммитерах. Я вхожу в svn с помощью tortoise plink и SSH-ключа.
Коммиты в репозитории git, которые не были отправлены в SVN, имеют такую информацию как:
Collin Hockey <chockey@xyz.com>
Коммиты, которые были отправлены в репозиторий svn, имеют следующее:
chockey <chockey@6206317d-b652-48a9-a948-4036602fc523>
Можно ли как-нибудь предотвратить расщепление этих ветвей? Я могу исправить это, повторив
git rebase master my-topic
еще раз, но я чувствую, что в этом нет необходимости. Основная проблема заключается в том, что после того, как изменения ветки передаются в SVN, git больше не думает, что эта ветка была где-то объединена. Это затрудняет удаление старых веток, которые вам больше не нужны.