Subversion не объединяет изменения в переименованные файлы? - PullRequest
25 голосов
/ 09 октября 2008

У меня следующая проблема с использованием Subversion:

В настоящее время я работаю над стволом моего проекта и планирую провести некоторый рефакторинг (который включает переименование файлов или перемещение файлов в разные каталоги).

В то же время кто-то еще работает над тем же проектом на ветке.

В какой-то момент я хочу объединить изменения, сделанные в ветке, с магистралью. Сюда входят изменения, внесенные в файлы (в ветви), которые были переименованы в транке.

Я провел несколько тестов, и кажется, что либо Subversion не в состоянии следить за этими изменениями, либо мне не хватает чего-то (на что я и надеюсь). Я проверил это с помощью следующего скрипта (должен работать в Bash, предполагает хранилище SVN в "http://myserver/svn/sandbox"):

svn co http://myserver/svn/sandbox

cd sandbox/

mkdir -p MyProject/trunk MyProject/branches MyProject/tags

cat - <<EOF >MyProject/trunk/FileOne.txt
Test
1
2
EOF

svn add MyProject

svn commit -m "init"

# create a branch
svn copy http://myserver/svn/sandbox/MyProject/trunk http://myserver/svn/sandbox/MyProject/branches/Branch_1 svn copy http://myserver/svn/sandbox/MyProject/trunk http://myserver/svn/sandbox/MyProject/branches/Branch_1

# rename the file
svn move MyProject/trunk/FileOne.txt MyProject/trunk/FileTwo.txt

svn commit -m "renamed file"

svn update 

# change the content of FileOne in branch

cat - <<EOF >MyProject/branches/Branch_1/FileOne.txt
Test
2
3
EOF

svn commit -m "changed branch"

# I now try to merge the changes in FileOne back to FileTwo
cd MyProject/trunk/
svn merge -r1:HEAD http://myserver/svn/sandbox/MyProject/branches/Branch_1
# but this yields the following message:
# Skipped missing target: 'FileOne.txt'

Любая помощь очень ценится.

Edit: Возможно, процесс, предложенный mikegrb, может быть несколько автоматизирован, сначала сгенерировав карту переименованных файлов (old-> new) из команды svn log в транке:

svn log -v
------------------------------------------------------------------------
r33 | sme | 2008-10-09 15:17:54 +0200 (Do, 09 Okt 2008) | 1 line
Changed paths:
   D /MyProject/trunk/FileOne.txt
   A /MyProject/trunk/FileTwo.txt (from /MyProject/trunk/FileOne.txt:31)


resulting map: {FileOne.txt => FileTwo.txt}

Теперь используйте эту карту для изменения имен файлов в файле патча, сгенерированном на ветке.

Оригинал:

Index: FileOne.txt
===================================================================
--- FileOne.txt (.../trunk)     (revision 31)
+++ FileOne.txt (.../branches/Branch_1) (revision 34)
@@ -1,3 +1,3 @@
 Test
-1
 2
+3

изменение:

Index: FileTwo.txt
===================================================================
--- FileTwo.txt (.../trunk)     (revision 31)
+++ FileTwo.txt (.../branches/Branch_1) (revision 34)
@@ -1,3 +1,3 @@
 Test
-1
 2
+3

Просто идея, еще не сделали этого.

Ответы [ 4 ]

23 голосов
/ 09 октября 2008

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

12 голосов
/ 09 октября 2008

К сожалению, это одно из ограничений subversion. Когда у нас недавно была похожая ситуация, мы решили создать один гигантский diff для ветви, а затем просмотреть файл за файлом, вручную исправляя ствол. Файлы, которые были переименованы и не найдены, заставят patch запрашивать имя файла для исправления. Очень субоптимальный. Следите за двоичными файлами, которые не будут отображаться в diff. Это был один из важных факторов, побудивших нас оценить другие системы контроля версий и в конечном итоге принять решение о переходе на git.

1 голос
/ 22 августа 2012

Обходной путь - синхронизировать ветвь с соединительной линией перед синхронизацией ствола с ветвью

Разница в том, что у ствола к ветке есть файл, к которому можно применить изменения (переместить), в то время как у ветви к стволу нет файла, к которому можно применить изменения (изменить). Это просто потому, что SVN, похоже, не отслеживает, куда файлы перемещаются / переименовываются. Я не знаю, почему это не так, надеюсь, для этого есть веская причина.

Пример:

  • ред. 1: /trunk/foo.txt перемещен в /trunk/folder/foo.txt
  • rev 2: /branches/mybranch/foo.txt изменен

Как объединить изменения foo.txt в транк?

Решение:

  1. Слияние всех ревизий от ствола к mybranch и фиксация. Это приведет к перемещению файла foo.txt.
  2. Слияние всех ревизий от mybranch до ствола. Это обновит содержимое файла foo.txt, поскольку теперь они имеют одинаковый путь.

Примечание. Если вы переместили / переименовали разные файлы как в стволе, так и в mybranch, то вас ждет поездка. Полагаю, вам придется выборочно объединять изменения, чтобы сначала перемещать / переименовывать в обоих направлениях, а затем объединять изменения.

1 голос
/ 09 октября 2008

Вероятно, вам придется переименовать их в ветке. Можете ли вы объединить ревизию, которая переименовала их из ствола в ветку? Это может сэкономить время. В противном случае вам придется переименовать их в ветке. Затем попробуйте выполнить слияние с магистралью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...