Может ли git-svn правильно заполнять свойства svn: mergeinfo? - PullRequest
32 голосов
/ 03 апреля 2009

Я оцениваю 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)

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

Ответы [ 4 ]

52 голосов
/ 12 мая 2011

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

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

-mergeinfo =

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

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

Edit:

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

ключ конфигурации: svn.pushmergeinfo

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

12 голосов
/ 12 мая 2009

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

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

6 голосов
/ 16 декабря 2010

Похоже, они работают над этим. Это может быть возможно в следующей версии:

http://git.kernel.org/?p=git/git.git;a=commit;h=6abd9332f97441a568421ba233ad8929b50a7efc

1 голос
/ 10 сентября 2012

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

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

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

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

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

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

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

Для получения более подробной информации см. Документация SubGit и Сравнение SubGit и git-svn .

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

...