Повторное слияние вручную с помощью слияния SVN

Я пытаюсь исправить проект SVN, в котором произошло следующее:

Функциональная ветка была взята из ствола. В эту ветку происходили регулярные коммиты. Когда пришло время объединить ветку обратно в транк, разработчик использовал не SVN-слияние, а WinMerge (!), Поэтому мы потеряли для этого всю нашу историю. Кроме того, в руководстве WinMerge было упущено несколько мелких исправлений ошибок. Это произошло несколько недель назад, и с тех пор происходили регулярные коммиты в ствол, поэтому мы не можем просто вернуться.

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

Если я попытаюсь вернуться к точке до этого «BadMerge», а затем сделаю правильное слияние, я не смогу повторно слить другие изменения, которые произошли после BM.

Итак, я думаю, что мне нужно использовать svnadmin dump and load, аналогично этому, но я не могу понять, что мне нужно делать.

  1. Дамп изменений до BM (ChangesetX).
  2. Дамп изменений поста BM (ChangesetY.
  3. Загрузить ChangesetX для чего? новое репо?
  4. Сделайте правильное слияние этого
  5. Загрузить набор измененийY

Это возможно? Любая помощь будет принята с благодарностью.

Спасибо

Том


person Tom    schedule 09.03.2011    source источник


Ответы (3)


Что вы можете сделать:

  1. Бросьте книгу SVN этому разработчику, желательно в виде распечатки на какой-то плотной бумаге. . (Если ему удастся выжить, уволите его.)

  2. SVN может пройти через режимы слияния и записи, чьи версии были объединены в свойствах файла и папки, но на самом деле не изменить любые файлы. (Использование болтовни SVN: их «статус собственности» «изменен», а их «текстовый статус» - нет.)

Я давно не использовал командную строку SVN, поэтому не знаю, как это сделать, но TortoiseSVN имеет это:

введите описание изображения здесь

person sbi    schedule 09.03.2011
comment
Просмотрите страницу 140 из svnbook.red-bean.com/en/1.7 /svn-book.pdf для команды svn ... - person andreas buykx; 07.06.2012

Возможно, не самый элегантный способ, но выполнимый на стороне клиента:

  • svn экспорт HEAD ствола в каталог A
  • svn checkout BAD_COMMIT транка в каталог B
  • копировать файлы из A в B

B теперь содержит все коммиты после BAD_COMMIT как локальные изменения (вы теряете различие между этими коммитами).

В настоящее время:

  • svn checkout BAD_COMMIT-1 транка в каталог C
  • выполните слияние svn вашей ветки и начальную точку вашей ветки в стволе в рабочую копию C
  • скопировать C в A

Теперь у вас есть правильное слияние в каталоге A, поскольку локальные изменения в HEAD. Фиксация A. Транк теперь имеет правильное слияние как HEAD.

Ну наконец то:

  • svn обновить B до HEAD
  • разрешать конфликты
  • совершить B

На этом этапе вы совершили нормальное слияние и все изменения после неудачного слияния. Вы теряете часть истории, но у вас меньше хлопот, чем при работе с дампами на стороне сервера.

Удачи!

person ypnos    schedule 09.03.2011

Вы не ограничены в использовании того, что ваш инструмент управления версиями считает общей базой, и запись слияния типа sbi предполагает, вероятно, хорошая идея. Если ничего не помогает, вы всегда можете выполнить слияние вручную, проверив три версии файла и используя KDiff3 непосредственно на тех, что описаны в ответе, приведенном выше.

Если версии X и Y взяты из функциональной ветви, а версии от A до E находятся в магистрали,

    A----------+
    |          |
    |          |
   \_/        \_/
    B          X
    |          |
    |          |
   \_/        \_/
    C <======= Y   Merge without being recorded by svn as a merge (right?), aka BadMerge
    |
    |
   \_/
    D
    |
    |
   \_/
    E

Затем, чтобы повторить слияние, проверьте версии A, Y и B и выполните слияние с помощью kdiff3. Это даст вам новую версию C ', в которой предпочтительно не будет ошибок, представленных в C. Затем вы хотите, чтобы остальные изменения были внесены в ствол, поэтому объедините C', C и E. Это должно дать вам новую версию, которую вы можете зарегистрировать как версию F.

Я недостаточно хорошо знаю svn, чтобы давать какие-либо советы о том, как вы должны проверять C' и как с этим справиться, но приведенные выше шаги должны по крайней мере дать вам желаемый конечный результат.

person hlovdal    schedule 10.03.2011