Может ли git -svn правильно заполнить svn: свойства mergeinfo?

Я оцениваю git -svn и пытаюсь определить, насколько хорошо он будет играть с конкретным репозиторием svn. В основном я заинтересован в получении git -svn для выполнения слияний таким образом, чтобы свойство svn: mergeinfo было правильно установлено в реверсе subversion. Возможно ли это?

Вот что я сделал до сих пор:

# Checkout the SVN repo.
$ git svn clone svn://server/project1 -T trunk -b branches -t tags

# Make sure we are working on trunk.
$ git reset --hard remotes/trunk

# Modify the working copy.
$ vim file.txt

# Commit locally to the git repo.
$ git commit -a

# Push the commits back to the SVN server.
$ git svn dcommit
Committing to svn://server/project1/trunk ...
    M   file.txt
Committed r178
    M   file.txt
r178 = b6e4a3a0c28e7b9aa71d8058d96dcfe7c8a2b349 (trunk)

Теперь, как я могу объединить эту конкретную фиксацию в одну из ветвей subversion? Опять же, для меня очень важно, чтобы git правильно установил свойство svn: mergeinfo при совершении изменения.

Ответ 1

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

git svn dcommit теперь принимает флаг -mergeinfo=<mergeinfo>. Чтобы процитировать страницу 1.7.5+:

-mergeinfo = <mergeinfo>

Добавьте данные слияния во время dcommit (например, --mergeinfo = "/branches/foo: 1-10" ). Все версии сервера svn могут хранить эту информацию (как свойство), и клиенты svn, начиная с версии 1.5, могут ее использовать. git svn в настоящее время не использует его и не устанавливает его автоматически.

При использовании этого нужно быть очень осторожным. Несмотря на то, что в man-странице сказано "добавить", что это означает, это "заменить". То есть атрибут svn:mergeinfo устанавливается на основе переданного, он не добавляет указанные изменения к уже существующему svn:mergeinfo. Учитесь на моей ошибке...

Изменить:

Похоже, что они все еще продолжают улучшать это еще больше. Начиная с git -svn 1.7.7, следующий текст был добавлен на страницу git -svn:

config key: svn.pushmergeinfo

Эта опция заставит git -svn попытаться автоматически заполнить свойство svn: mergeinfo в репозитории SVN, когда это возможно. В настоящее время это можно сделать только тогда, когда domming non-fast-forward объединяется, когда все родители, кроме первого, уже были перенесены в SVN.

Ответ 2

Короткий ответ: Нет, git -svn не заботится о свойствах svn: mergeinfo, поскольку git -svn не делает слияния обратно в svn (он совершает коммиты).

Длинный ответ: Большинство людей используют git -svn, чтобы выбраться из сглаженного слияния svn. Проблема с svn заключается в том, что она не различает копирование файлов или папок (часто вызванных рефакторингом) и создание ветки, так как создание ветки или тега выполняется с помощью команды "svn copy". Свойство svn: mergeinfo является полосой помощи по этой проблеме, но все же есть случаи, когда модификации неоднозначны. Git имеет гораздо более надежную поддержку для ветвления и слияния.

Ответ 4

Теоретическая часть

Проблема заключается в том, что Subversion и Git имеют значительно различную механику отслеживания слияния.

В результате некоторая информация о слиянии не может быть правильно переведена из Subversion в Git. Например, Git не отслеживает выбор вишни вообще, когда SVN отслеживает их даже на уровне подкаталогов.

С другой стороны, нет проблем с представлением истории слияния Git в Subversion. Но будьте осторожны, так как некоторые свойства файла SVN/каталога отсутствуют в репозитории Git (например, svn: keywords), модификации этих свойств теряются в репозитории SVN после того, как вы выполните коммит слиянием.

Практическая часть

git -svn автоматически не устанавливает свойство svn: mergeinfo в соответствии со всеми родителями Git commit. Но вы можете указать значение свойства вручную, прежде чем удалять соответствующую фиксацию.

Посмотрите SubGit, замену на сервер для git -svn. Он преобразует информацию о слиянии в обоих направлениях, когда это возможно. Он также поддерживает такие свойства SVN, как svn: ignore, svn: eol-style и svn: mime-type.

Подробнее см. Документация SubGit и SubGit vs. git -svn.

SubGit - это коммерческий продукт со свободными возможностями для open-source, академических и небольших проектов. И я один из разработчиков SubGit.