2012-01-24 4 views
2

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

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

  1. создал ветку от ствола
  2. обновления файла в багажнике
  3. Переместите файл в ветви
  4. обновление файла в филиале
  5. Doing совмещенный из ответвления обратно в ствол

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

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

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

+0

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

+0

В реальном коде будет перемещено много файлов. Некоторые файлы (перемещенные и не перемещенные) также могут быть изменены. – lwijono

ответ

1

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

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

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

+0

Я реорганизовал большой проект предприятия с svn. Его утомительный процесс и занимает много времени. Поэтому моя рекомендация состоит в том, чтобы поддерживать филиал в актуальном состоянии с помощью соединительной линии. Не позволяйте ветке бежать за багажником, а затем вы закончите с огромной проблемой слияния. – Sriram

+0

Также обратите внимание, что вы можете потерять некоторую историю во время синхронизации (соединительная линия для ветвления). – Sriram

1

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

1. Pure-СВН метод

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

2. Метод DVCS

Используйте любые DVCS с хорошим слиянием (они все имеют это - Git, Mercurial, Bazaar ...) и СВН-мост (ГИТ-SVN, hgsubversion ...), выполнять рефакторинг-слияние в DVCS-зеркальном репо. В конце концов - линеаризуйте репозиторий (SVN history in line, DVCS-DAG) с инструментами DVCS() и нажмите Resul на SVN-repo. Если для вас будет слишком сложная задача, вы можете экспортировать конечный результат из выбранного DVCS (для фона SVN я подумаю о Mercurial или Bazaar, а не Git) в неверсифицированное дерево и просто сделайте однонаправленную синхронизацию WC туловища с этим деревом

+0

Используя метод 1, вы создадите информацию об объединении поддерева, которая сделает невозможным дальнейшее объединение слияния. –

+0

У меня проблемы с пониманием метода 1. Исправьте меня, если я ошибаюсь, но это то, что вы имеете в виду? Во-первых, объедините все измененные файлы в ветви со своим соответствующим файлом (оригиналом) из соединительной линии. Затем мне нужно передать код из ветки в репозиторий (филиал). Затем я объединю ревизию с ветки обратно в магистраль (последняя). Это то, что вы имеете в виду? – lwijono

+0

@lwijono - когда вы объединяете файлы, вы сливаетесь со стволом, а не с веткой –