2009-12-09 4 views
3

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

Я знаю, что могу проверить код на магистраль, а затем использовать svn merge, чтобы получить изменения на ветке, но есть ли способ сделать это без предварительной проверки изменений?

К сожалению, diff/patch не будет работать, так как есть изменения в коде, окружающем мои изменения между сундуком и веткой. Я знаю, что svn merge может справиться с ними, но, как я уже сказал, лучше не сначала проверять свои изменения.

Edited добавить пример:

Ствол имеет файл, содержащий следующее:

File in trunk:      File in branch: 
apple        apple 
orange        banana 
pear         pear 

В багажнике, я добавляю dragon fruit ниже pear в файле ствола на моей рабочей копии. Если бы я проверил, что изменение и использование слияния для его копирования в ветви, Subversion правильно добавит dragon fruit ниже pear в ветке версии файла.

svn diff на моей копии файла ствол производит нечто похожее на следующее:

Index: fruit.txt 
=================================================================== 
--- fruit.txt (revision 56) 
+++ fruit.txt (working copy) 
@@ -1,3 +1,4 @@ 
apple 
orange 
pear 
+dragon fruit 

Очевидно, используя патч не будет работать, так как он замечает разницу между не изменились текстами.

То, что я хочу произойти, без того, чтобы проверить что-либо, чтобы иметь dragon fruit перечислены после pear в обоих файлах, но не иметь разницу orange/banana изменен на любой файл.

ответ

4

Вы можете svn switch копию вашей рабочей копии в филиал.

Ваша самая безопасная ставка состоит в том, чтобы зафиксировать изменения в частной ветке и использовать svn merge, чтобы объединить их там, где они вам нужны.

+1

Но DO сначала сделайте резервную копию того, что на вашем диске. Переключатель SVN пытается изо всех сил, но никаких гарантий нет. –

+0

svn switch выглядит как лучший вариант, который у меня есть на данный момент. Это далеко не идеальный, но это нужно сделать. –

1

Ни switch, ни merge, ни diff решает проблему наличия определенных изменений, которые вы хотите портировать более и определенные изменения, которые вам не ’ т (при условии, что эти изменения находятся в пределах того же набора файлов, если они находятся в разных файлах , вы можете переносить только соответствующие файлы).

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

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

+0

Я использую TortoiseMerge на данный момент, но, насколько я могу судить, он предлагает только метод diff/patch для перемещения изменений; это не будет работать, поскольку код в ветке изменился относительно кода в соединительной линии. Если вы не хотите использовать что-то вроде TortoiseDiff/WinDiff, чтобы сравнить различия и переместить их вручную ... –

1

Причина, по которой вы не можете применить патч svn diff, заключается в том, что версия кода в соединительной линии должна быть более поздней, чем изменение в вашей внешней линии. Это распространенный сценарий, когда вы можете разветвляться, чтобы работать над функцией, и работа продолжалась на багажнике.

Чтобы решить эту проблему, вам необходимо довести ветку до ствола, затем используйте diff.

svn merge svn://path/to/trunk /path/to/working-copy

Это приведет вашу ветку до даты с сундуком. Если возникнут какие-либо конфликты, вам придется их разрешить.

Теперь

svn commit /path/to/working-copy -m "Merged latest trunk changes into the branch"

затем,

svn diff /path/to/trunk > my-new-code.patch

и, наконец,

cd /path/to/working-copy patch -p0 -i /path/to/my-new-code.patch

Ваша рабочая копия ветки теперь будет обновлена ​​с помощью соединительной линии, плюс она будет иметь ваши новые изменения ... и не будет затронута версия репозитория соединительной линии.

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

Это предполагает, например, что филиал был создан на основе пересмотра 30 ствола и что изменения вы хотите импортировать в ревизии 56 ствола

  1. svn up /path/to/branch-WC
  2. svn up /path/to/trunk-WC -r 30
  3. svn merge svn://path/to/trunk -r 55:56 /path/to/trunk-WC
  4. cd /path/to/trunk-WC
  5. svn diff /path/to/trunk-WC > /path/to/branch-WC/mychange.patch
  6. cd /path/to/branch-WC
  7. patch -p0 -i mychange.patch

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

Затем, объединив ревизию 55:56, вы спрашиваете ТОЛЬКО для «разницы драконов». Так как изменение версии оранжевого/бананового не было сделано между версией 55:56, этот diff не будет введен в файл исправления.

Если изменение в ревизии 56 зависит от предыдущих наборов изменений, возможно, вам придется разрешить некоторые конфликты или слить еще несколько изменений (так как эта версия 30 trunk не будет знать о них), но это должно быть именно то, что вам нужно.

+0

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

1

Этот вопрос старый, но до сих пор я отправляю правильное решение

http://ariejan.net/2007/07/03/how-to-create-and-apply-a-patch-with-subversion

Короче на стволе делают

svn diff > ~/trunk.diff 

, а затем на ветви корня

patch -p0 -i ~/trunk.diff 
+1

Из вопроса: «К сожалению, diff/patch не будет работать, так как есть изменения в коде, окружающем мои изменения между сундуком и веткой». –

+0

@me_and В этом случае вам сначала необходимо объединить изменения из магистрали в ветку, которые являются предпосылкой для объединения 'trunk.diff' в ветку. –

+1

@phaedrus: Из вопроса: «Я знаю, что' svn merge' может справиться с окружающими изменениями, но, как я уже сказал, мне бы не пришлось сначала проверять мои изменения ». –

Смежные вопросы