Лучшая практика subversion для слияния ветки с магистралью, где файловая структура в ветке была изменена

Я столкнулся с ситуацией, когда моя команда разработчиков хотела бы реорганизовать файловые структуры в наших репозиториях. Этот процесс займет около 2-3 месяцев. Во время реструктуризации файла нам еще нужно сделать релизы программного обеспечения. Итак, после процесса реструктуризации мы хотим объединить организованные файлы из ветки обратно в магистраль. Важно сохранить историю файлов, а также нам нужно иметь возможность объединить изменения кода в стволе с момента первого создания ветки.

Моя первоначальная попытка заключалась в создании ветки, а затем ее простом слиянии. К сожалению, это не так просто, как я думал. Один из моих тестовых сценариев был следующим:

  1. Создал ветку из ствола
  2. Обновить файл в багажнике
  3. Перенести файл в ветку
  4. обновить файл в ветке
  5. Выполнение слияния из ветки обратно в ствол

На шаге 5 я получил ошибку «конфликт дерева» в файле, который я обновляю в стволе. TortoiseSVN не дает информации о том, к какому файлу в ветке относится конфликтующий файл. В моем сценарии разобраться в файлах с проблемами не так уж и сложно; однако в нашем реальном репозитории это будет очень сложно, потому что у нас есть тысячи файлов, и многие из этих файлов имеют одинаковые имена (в разных папках).

Есть ли у кого-нибудь опыт в той же ситуации, что и я? Какие-либо предложения / передовые методы, которые я должен / могу сделать, чтобы обеспечить целостность кодов?

Спасибо за помощь.


person lwijono    schedule 24.01.2012    source источник
comment
Если единственная разница между шагами 2 и 3 - это один новый файл, я бы просто обновил вашу ветку из ствола. Я думаю, что когда они объединяются с использованием описанного выше метода, новые файлы в вашей ветке не существуют в стволе, по крайней мере, насколько это известно ветке.   -  person user1231231412    schedule 24.01.2012
comment
В реальном коде было бы перемещено много файлов. Некоторые файлы (перемещенные и не перемещенные) также могут быть изменены.   -  person lwijono    schedule 24.01.2012


Ответы (2)


Вы можете пойти двумя путями

1. Метод Pure-SVN

После рефакторинга перед объединением /branches/branchname /trunk каталогов, объедините все переименованные / перемещенные файлы из ветки с их исходными стволами, т. Е. /branches/branchname/some/branchfile1 /trunk/trunkfile1 ... и объединить каталоги на последнем этапе

2. Метод DVCS

Используйте любую DVCS с хорошим слиянием (они все это есть - Git, Mercurial, Bazaar ...) и svn-bridge (git-svn, hgsubversion ...), выполните рефакторинг-слияния в DVCS- зеркальное репо. В конце концов - линеаризуйте репозиторий (история SVN в строке, DVCS -DAG) с помощью инструментов DVCS (... rebase) и отправьте результат в SVN-репо. Если перебазирование будет для вас слишком сложной задачей, вы можете экспортировать конечный результат из выбранного DVCS (для фона SVN я буду думать о Mercurial или Bazaar, а не о Git) в неверсированное дерево и просто выполните однонаправленную синхронизацию WC ствола. с этим деревом

person Lazy Badger    schedule 24.01.2012
comment
Используя метод 1, вы создадите информацию о слиянии поддерева, которая сделает невозможным дальнейшее реинтегрирование слияний. - person Peter Parker; 24.01.2012
comment
У меня проблемы с пониманием метода 1. Поправьте меня, если я ошибаюсь, но это то, что вы имеете в виду? Сначала объедините все измененные файлы в ветке с их соответствующим файлом (исходным) из ствола. Затем мне нужно передать код из ветки в репозиторий (ветку). Затем я объединяю ревизию из ветки обратно в ствол (последнюю). Это то, что вы имеете в виду? - person lwijono; 25.01.2012
comment
@lwijono - когда вы объединяете файлы, вы объединяете их в магистраль, а не в ветку - person Lazy Badger; 25.01.2012
comment
Я попытался объединить перемещенный / переименованный код из ветки обратно в ствол. Однако, если в транке поменять и сами коды, то у меня этот способ не сработает. - person lwijono; 25.01.2012

Вот что я в итоге сделал: 1. Слияние всех переименованных и измененных файлов в ветке со всеми обновлениями (если применимо) из ствола 2. Зафиксировать ветку в репозитории. Теперь ветка имеет последний код, включая изменения из ствола с момента первого создания ветви. 3. Объедините все изменения из ветви обратно в ствол. Магистраль не будет иметь всю обновленную структуру файлов и все изменения, которые происходят как в магистрали, так и в ветви реорганизации.

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

Шаг №1 - утомительный процесс, но в моем тесте он работает. Возможно, это не лучшее решение, но оно работает для меня (поддерживайте обновления как из ствола, так и из ветки, а также сохраняйте историю).

person lwijono    schedule 25.01.2012
comment
Я реорганизовал большой корпоративный проект с помощью svn. Это утомительный процесс и отнимает уйму времени. Итак, я рекомендую регулярно обновлять ветку с помощью транка. Не позволяйте ветке идти за стволом, и тогда вы столкнетесь с огромной проблемой слияния. - person Sri; 15.08.2015
comment
Также обратите внимание, что вы можете потерять часть истории во время синхронизации (от ствола к ветке). - person Sri; 15.08.2015