2010-04-22 4 views
6

Я использую svn. У меня два филиала, и на обоих из них было сделано много изменений. В дополнение к одной из ветвей было переименовано много файлов, поэтому теперь svn не может помочь мне объединить изменения в этих файлах (хорошо известно ограничение svn).git-svn merge 2 svn branch

  1. Возможно ли использовать git-svn для слияния ветвей?
  2. Будет ли git-svn обрабатывать переименованные файлы?

Благодаря

+0

См. Этот ответ: http://stackoverflow.com/questions/2945842/using-git-svn-or-similar-just-to -help-out-with-svn-merge/3585702 # 3585702 –

+0

См. http://stackoverflow.com/questions/714589/can-git-svn-correctly-populate-svnmergeinfo-properties ... Часть «Изменить:» 2-го ответа (не принятый ответ) особенно хорош. –

ответ

7

git merge должен быть в состоянии обнаружить (до определенного момента) переименовывает.

recursive

Это может решить только две головы, используя алгоритм слияния 3-полосная.
Кроме того, это может обнаруживать и обрабатывать слияния с использованием переименований.
Это стратегия слияния по умолчанию при вытягивании или слиянии одной ветви.

Но git-svn может импортировать/экспортировать только из/в SVN, а не для слияния.
И слияние сложно:

ПРЕДОСТЕРЕЖЕНИЯ

Для простоты и совместной работе с менее умелой системы (SVN), рекомендуется, чтобы все git svn пользователи клонировать, принеси и dcommit непосредственно с сервера SVN, и избегать всех операций git clone/pull/merge/push между репозиториями и ветвями git.
Рекомендуемый способ обмена кодом между ветвями git и пользователями - git format-patch и git am, или просто 'dcommit'ing в SVN-репозиторий.

Выполнение git merge или git pull не рекомендуется на ветке, из которой вы планируете dcommit. Subversion не представляет собой слияние каким-либо разумным или полезным способом; поэтому пользователи, использующие Subversion, не видят никаких слияний, которые вы сделали. Кроме того, если вы сливаете или тянете из ветки git, которая является зеркалом ветви SVN, dcommit может передать неверную ветку.

Если вы сливаться, обратите внимание на следующее правило: мерзавец СВН dcommit попытается совершить на вершине SVN коммит назван в

git log --grep=^git-svn-id: --first-parent -1 

Таким образом, вы должны убедиться, что последние фиксации ветви, которую вы хотите dcommit to, является первым родителем слияния. В противном случае хаос будет иметь место, особенно если первый родитель является старшим фиксатором в той же ветви SVN.

1

У меня была такая же проблема в проекте в колледже.то, что я сделал следующее:

  • создать новый Git-SVN репозитория (git svn clone -s https://…)
  • объединить филиалы с Git (git checkout master; git merge branch)
  • проверки хобот с SVN (svn co https://…/trunk)
  • копию над объединенные файлы из мерзавца
  • удалить левую над файлами и каталогами с SVN (svn rm)
  • совершать с SVN (svn ci)
  • принести новое обязательство в мерзавце
+0

Спасибо за полезное резюме. Было ли git merge легким, проще, чем это делалось svn? (Я пытаюсь найти ответ на этот вопрос: http://stackoverflow.com/questions/2945842/using-git-svn-or-similar-just-to-help-out-with-svn-merge) – inger

+0

Еще одна вещь , вы пытались вернуться к svn? Если да, то какие вопросы вы получали/ожидали? – inger

+0

@inger, нет, я совершил с svn, чтобы убедиться, что я не заканчиваю тем, что отталкивал полупеченные слияния, которые только git поймет. – knittl

0

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