Git-Svn dcommit вызывает разделение ветвей - PullRequest
8 голосов
/ 08 апреля 2011

У меня проблема с git-svn dcommits, из-за которой репозиторий git теряет информацию о том, какие коммиты какие.

Я пытаюсь убедиться, что основная ветка в 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 с черепахой plink и ключом SSH.

Коммиты в репозитории git, которые не были отправлены в SVN, имеют информацию о коммитере как:

Collin Hockey <chockey@xyz.com>

Коммиты, которые былиотправленный в репозиторий svn, имеет это, хотя:Я могу исправить это, снова сказав

git rebase master my-topic

, но я чувствую, что это не нужно.Основная проблема в том, что как только изменения ветки передаются в SVN, git больше не думает, что ветка где-то была объединена.Это сбивает с толку удаление старых веток, которые вам больше не нужны.

Ответы [ 2 ]

10 голосов
/ 08 апреля 2011

Команда git svn dcommit работает следующим образом:

  1. Найти последний коммит из SVN; давайте назовем это last-svn
  2. Отправка коммитов в диапазоне last-svn..HEAD в Subversion (кстати, без электронного письма)
  3. Сброс HEAD до last-svn
  4. Обновление из SVN и создание соответствующих коммитов

Другими словами, коммиты, отправленные вами в SVN, уничтожаются и воссоздаются из обновления из SVN. Это должно произойти, потому что коммиты, которые приходят из SVN, отличаются от коммитов, созданных с помощью Git:

  • В их описании содержится ссылка на ревизию SVN
  • Электронный адрес их автора вычисляется из имени пользователя SVN

Вот почему ваша ветвь my-topic отличается от master.

Вы можете настроить способ, которым git svn dcommit вычисляет электронную почту автора по имени пользователя SVN с опциями --authors-file и --authors-prog.

3 голосов
/ 08 апреля 2011

вы правы, этот git снова воспроизводит коммиты из svn. ветви в git являются только указателями на коммиты (или там идентификаторы / хэши). коммиты из svn будут иметь разные хэши, и только текущая ветвь будет обновлена ​​на git svn dcommit, поэтому ветка вашей темы по-прежнему указывает на старые коммиты

...