SVN Объединить ветку из одного репо в ствол другого репо

У меня есть два репозитория, которые живут на разных серверах, назовите их репо-1 и репо-2.

Для начала оба «ствола» были равны:

репо-1 / ствол == репо-2 / ствол

Тем временем изменения вносились в репо-1 / ствол, а я работал и вносил изменения в репо-2 / ствол.

Теперь мне нужно объединить изменения из репо-1 / ствола в репо-2 / ствол.

Я думал, что скопирую репо-1 / ствол в репо-2 / теги / r1_20090224, а затем объединю этот тег в мою локальную рабочую копию репо-2 / ствола (т.е. c: \ dev \ repo2-trunk).

Есть предложения, как это сделать? Я пытаюсь использовать TortoiseSVN и выполняя «Объединить два разных дерева», я использовал следующие настройки:

От: repo-2 / trunk Кому: repo-2 / tags / r1_20090224 Рабочая копия: c: \ dev \ repo2-trunk

Я также пробовал поменять местами «от» и «на» ... но безуспешно. Пробуя любой из этих двух вариантов слияния, я либо получаю следующий результат:

  1. Если я сливаюсь из ствола в тег (в мою локальную копию репо-2 / ствола), я теряю изменения своего ствола и получаю изменения тега.

  2. Если я сливаюсь из тега в ствол (в мою локальную копию репо-2 / ствола), я теряю свои изменения тега и сохраняю свои изменения ствола.

Любые предложения по этому поводу?

Ответов (4)

SVK может помочь, если вы обнаружите, что постоянно управляете несколькими репозиториями с течением времени, которые необходимо время от времени синхронизировать.

Сначала выясните ревизию, где деревья были такими же. Затем слейте это из этой ревизии в HEAD репозитория репо-1 с вашей рабочей копией репо-2.

Используя клиент командной строки, это похоже на это, если вы хотите объединить изменения между r123 и r456

svn merge http://domain.tld/[email protected] http://domain.tld/[email protected] repos2-workingcopy

Это не совсем понятно, но вам нужно объединить основание двух деревьев, то есть точку, в которой два ствола были одинаковыми.

Сандер опередил меня в этом, так что честь ему, но вот еще пара советов:

  1. Как можно скорее объедините эти два репозитория в один; Subversion на самом деле не предназначена для такой работы. Или, в качестве альтернативы, перейдите на DVCS, например git или bazaar, или ...
  2. Если вы придерживаетесь Subversion, обычно такие вещи делаются с помощью веток , а не тегов . Теги обычно используются в качестве маркерных точек и не привязаны к ним.

Если svn merge вы потерпите неудачу на двух сайтах / серверах:

svn: Unusable URI: it does not refer to this repository

Затем используйте следующий подход:

  1. определить уровень ревизии, на котором repo-2началось отклонение от repo-1, скажем, 123 , затем:
  2. svn co http://server1/repo-1/trunk
  3. svn diff -r123:HEAD http://server2/repo-2/trunk >repo2.patches
  4. patch -p0 -i repo2.patches
  5. отследить возможные конфликты и разрешить их
  6. svn ci --message "merged from repo-2"