Подтвердить что ты не робот

Subversion не объединяет изменения в переименованные файлы?

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

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

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

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

Я сделал несколько тестов, и кажется, что либо подрывная деятельность не способна следовать этим изменениям, либо мне не хватает сообщений (на что я надеюсь). Я протестировал это, используя следующий script (должен работать в 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'

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

Изменить: Возможно, процесс, предложенный 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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Пример:

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

Как слияние изменений foo.txt в trunk?

Решение:

  • Объединить все изменения с соединительной линии на mybranch и совершить. Это приведет к перемещению foo.txt.
  • Объедините все изменения от mybranch к багажнику. Это обновит содержимое foo.txt, так как теперь у них есть один и тот же путь.

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