Обрабатывать переименования в параллельных ветвях - PullRequest
4 голосов
/ 24 мая 2010

У меня типичная настройка Subversion:

/trunk
/branches/client-one
/branches/client-two
/branches/client-three

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

[+] /trunk/readme-trunk.txt
[port] /trunk/readme-trunk.txt -> /branches/client-one/readme-trunk.txt
[port] /trunk/readme-trunk.txt -> /branches/client-two/readme-trunk.txt
[port] /trunk/readme-trunk.txt -> /branches/client-three/readme-trunk.txt

Работает довольно безупречно, кроме случаев, когда мне нужно переименовать файл. Теперь независимо от того, как я это делаю, у меня всегда возникают конфликты деревьев и, в зависимости от предпринимаемых шагов, я теряю локальные модификации или больше не могу переносить будущие изменения.

Можно ли переименовать файл и при этом переносить изменения туда и обратно?

[rename] /trunk/readme-trunk.txt -> /trunk/readme.txt
[port] /trunk/readme.txt -> /branches/client-one/readme.txt
[port] /trunk/readme.txt -> /branches/client-two/readme.txt
[port] /trunk/readme.txt -> /branches/client-three/readme.txt

[edit] /trunk/readme.txt
[port] /trunk/readme.txt -> /branches/client-one/readme.txt
[port] /trunk/readme.txt -> /branches/client-two/readme.txt
[port] /trunk/readme.txt -> /branches/client-three/readme.txt

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

1 Ответ

1 голос
/ 27 мая 2010

Я много читал с тех пор, как задал вопрос, и похоже, что переименование файлов является слабым местом большинства систем контроля версий. Что касается Subversion, это одна из тех вещей, которые просто невозможно сделать (например, слияния до 1.5).

Это обходной путь, который лучше всего работает:

  1. Выполнить обычное переименование (копирование + удаление) в транке. Commit.
  2. Для каждой отрасли:
    • Пометить версию от # 1 как объединенную, например, svn merge --record-only (командная строка) или [X] Only record the merge (TortoiseSVN).
    • Выполнить обычное переименование (копировать + удалить).

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

(На самом деле не проверено на каталогах, только простые файлы. Комментарии приветствуются.)

...