git-svn объединяет несколько пультов - PullRequest
2 голосов
/ 30 июня 2011

У меня есть настройка git-svn для отслеживания двух удаленных местоположений svn, скажем http://svnserver/develop/project и http://svnserver/release/project.

Я также создал локальные ветви пультов для внесения изменений и выполнения их. Однако, когда я пытаюсь объединить изменение из локальной ветви разработки в локальную ветку выпуска, я получаю конфликты, которые необходимо разрешить в текстовом редакторе.

Пример рабочего процесса

# Setup the repos
git svn init http://svnserver/develop/project -R develop -i svn-develop
git svn init http://svnserver/release/project -R release -i svn-release
git svn fetch develop
git svn fetch release
git checkout svn-release
git checkout -b release
git checkout svn-develop
git checkout -b develop

# Make changes to develop branch and commit to svn
git commit -a -m "Changes"
git svn dcommit

# I'd like to bring changes to release branch
git checkout release
git merge develop --squash

# Ack! Conflicts :<

Почему git не может просто применить diff к ветке релиза? Я неправильно настроил пульты? Это потому, что они не отслеживаются одним родителем?

Ценю помощь!

Ответы [ 2 ]

1 голос
/ 30 июня 2011

Короткий ответ: нет, вы не можете сделать это.

Немного подробностей:

Ваша первоначальная проблема слияния заключается в том, что svn-release и svn-development неподелиться родительским коммитом, и инструменты автоматического слияния git просто не будут работать.Вам придется объединить вручную и создать коммит, который они оба совместно используют как родительский.

Проблемы на этом не заканчиваются.Subversion - это механизм управления коммитами, и вы заметите, что когда вы делаете git svn dcommit, ваши локальные коммиты, которые выдвигаются, фактически переписываются после того, как переходят в subversion, чтобы отразить номер ревизии svn.Это изменяет локальный git sha1sum коммита, который по сути является переписыванием истории.Переписывание истории вызывает всевозможные проблемы, если у вас есть другие локальные ветви git, с которыми вы объединяетесь, и будет продолжать сталкиваться с проблемами слияния в будущем.

По сути, если вы делаете свой первоначальный коммит слияния, выполнитедоработайте и добавьте эти изменения обратно, ваш коммит слияния будет переписан, изменен sha1sum, и ваши ветви больше не будут иметь родителя.Вы начинаете с одной и той же проблемы снова и снова каждый раз, когда хотите объединить / нажать.

0 голосов
/ 25 апреля 2013

Более длинный ответ: да, вы можете сделать это, но не тривиально.

Обстоятельство, в котором я нахожусь, заключается в том, что у меня есть два отдельных хранилища SVN, которые ранее управлялись с помощью Bazaar. Они имеют общую историю (перенесенную Bazaar из одного хранилища в другое), но имеют совершенно разные идентификаторы коммитов, потому что они были в разных репозиториях, и git-svn сворачивает идентификатор репо в сообщение фиксации, что влияет на SHA1.

Что у них будет общего, так это то, что их идентификаторы корневого дерева будут одинаковыми вплоть до точки, в которой они расходятся - SHA1 объекта дерева будет одинаковым для идентичных деревьев.

Итак, мой план:

  • Удалите одно или оба хранилища SVN (я действительно не хочу делать это снова)
  • Перенос всех ревизий в один и тот же репозиторий Git

    1. Клонируйте оба дерева в разные репозитории Git
    2. Перечислите все идентификаторы корневого дерева и сравните их, чтобы найти точку, в которой они расходятся.
    3. Создайте ветку в моем целевом хранилище на этом этапе
    4. За каждую последующую ревизию в моем исходном хранилище
      • Проверьте это в исходном хранилище
      • Заменить дерево в целевом хранилище этим деревом
      • Зафиксируйте эту ревизию

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

...