SVN: заменить ствол с ответвлением


155

Каков наилучший способ сделать одну из ветвей хранилища Subversion новым стволом?

Была проведена большая перезапись всей системы: все было перемещено, переписано, заменено, удалено, переименовано и т. Д. Переписанный код был протестирован и готов заменить старый ствол.

По сути, старая магистраль (магистраль 5) помечена и заканчивается здесь. Переписанная ветвь (ветвь 6) станет новой магистралью (ствол 7):

Ствол (1) -> Ствол (2) -> Ствол (5) -> × + -> новый Ствол (7)
  \ \ |
  вилка слияния ???
    \ \ |
     + -> Ветвь (3) -> Ветвь (4) -> Ветвь (6) - +

Все текущие изменения из старого «Ствола» уже включены в «Переписанный филиал»

Как я могу это сделать?

Ответы:


118

Используйте svn move, чтобы переместить содержимое старого ствола куда-нибудь еще, а потом переименовать ветвь в ствол.

Обратите внимание, что копирование и перемещение в SVN работают как файловые операции. Вы можете использовать их для перемещения / копирования материалов в вашем хранилище, и эти изменения также имеют свои версии. Думайте о «переместить» как «копировать + удалить».

[EDIT] Nilbus только что уведомил меня, что вы получите конфликты слияния при использовании svn move.

Я все еще думаю, что это правильный подход. Это приведет к конфликтам, но если вы будете аккуратно сливаться, скорее всего, вы не потеряете данные. Если это вас беспокоит, используйте лучшие VCS, такие как Mercurial или Git .


1
Если вы сделаете это, у любого с изменениями в рабочей копии в исходной стволе будет конфликт, даже если их изменения должны объединиться. Это потому, что файлы удаляются и повторно добавляются - они рассматриваются как отдельные объекты с отдельной историей.
Эдвард Андерсон

@nilbus: ты пробовал это? IIRC, SVN показывает, что файлы были удалены и прочитаны, но внутри он будет знать, что файлы были перемещены.
Аарон Дигулла

Да. Я проверил две копии. В первом экземпляре я переместил dir A в A2 и dir B в A. Затем переместил A в B, затем A2 в A. (переименовать и переименовать обратно.) Во 2-ом оформлении я внес изменения в файл и попытался выполнить svn. Обновить. Это противоречило, потому что файл, который я изменил, "был удален". Внутренне он не сохраняет дубликаты файлов, но удаление, которое вы видите, действительно влияет на вас, когда дело доходит до конфликтов.
Эдвард Андерсон

12
@nilbus: На данный момент я хотел бы процитировать Линуса Торвальдса: «На какое-то время лозунг Subversion был« CVS сделан правильно », или что-то в этом роде, и если вы начнете с такого рода слоганом, вы нигде не сможете идти. Нет способа сделать CVS правильно. "
Аарон Дигулла

3
Ага. Я бы согласился. Чтобы решить эту проблему, я на самом деле проверил репозиторий с помощью svn-git и использовал git, чтобы перебазировать ветку на мастер.
Эдвард Андерсон

66

Я согласен с использованием команды svn move для достижения этой цели.

Я знаю, что другие здесь думают, что это необычно, но мне нравится делать это таким образом. Когда у меня есть ветвь функций, и я готов объединить ее со стволом, который также был значительно изменен, я объединю его с новой веткой, обычно называемой <FeatureBranchName>-Merged. Затем я разрешаю конфликты и проверяю объединенный код. После этого я перемещаю транк в папку тегов, чтобы ничего не потерять. Наконец я перехожу <FeatureBranchName>-Mergedк багажнику.

Кроме того, я предпочитаю избегать рабочей копии при выполнении ходов, вот примеры команд:

svn move https://SVNUrl/svn/Repo/trunk https://SVNUrl/svn/Repo/tags/AnyName

svn move https://SVNUrl/svn/Repo/branches/BranchName-Merged https://SVNUrl/svn/Repo/trunk

Примечание: я использую 1,5


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

12

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

svn merge --ignore-родословная транк-URL

на рабочей копии моего багажника.

Это не пытается применить изменения в исторической манере (поддерживая изменения в стволе). Он просто «применяет различие» между стволом и веткой. Это не создаст никаких конфликтов для ваших пользователей в файлах, которые не были изменены. Однако вы потеряете свою Историческую информацию из ветви, но это произойдет, если вы все равно осуществите слияние.


1
После публикации SVN 1.5 вы сможете выполнять слияния, сохраняющие историю.
Ншервин

9

Рекомендую вам сделать эти изменения через браузер репозитория.

Попытка больших операций удаления + перемещения с помощью рабочей копии - отличный способ уничтожить рабочую копию. Если вы вынуждены использовать рабочую копию, выполняйте добавочные коммиты после каждой операции удаления или перемещения и ОБНОВЛЯЙТЕ свою рабочую копию после каждого коммита.


Ссылка на Репо была бы удобной (просто для удобства - сохраните поиск в Google :))
Брайан М. Хант

3
Сожалею. Правописание заставило меня выглядеть так, будто я имел в виду определенный инструмент (отредактировано). На самом деле, большинство инструментов SVN GUI должны иметь функцию обозревателя хранилища. К вашему сведению: я использую черепаху tortoisesvn.tigris.org
Крис Нава

4

Если вы хотите сделать ветку новой стволом (то есть) избавиться от всех изменений в стволе, которые были сделаны с момента создания ветки, вы можете: 1. Создать ветку ствола (для целей резервного копирования) 2. "отменить изменения msgstr "на стволе (выберите все ревизии после того, как ветвь была создана 3. Слить ветку обратно в ствол.

История должна оставаться такой.

С уважением, Роджер


3

Решения @Aaron Digulla и @kementeus работоспособны. В репозиториях Subversion 1.4 операции копирования / перемещения могут затруднить будущую миграцию в другую структуру репозитория или разделение репозиториев.

Я считаю, что улучшения 1.5 включают в себя лучшее разрешение истории перемещения / копирования, так что, вероятно, это не будет проблемой для хранилища 1.5.

Для хранилища 1.4 я бы порекомендовал использовать svnadmin dumpи svndumpfilterвыполнить перемещение существующего ствола в другом месте, а затем переместить ветвь в ствол с тем же механизмом. Загрузите два файла дампа в тестовый репозиторий, проверьте, а затем переместите его в рабочий.

Конечно, перед запуском сделайте резервную копию вашего существующего хранилища.

Это сохраняет историю без явной записи перемещения / копирования и облегчает будущую реорганизацию, сохранение истории.


Изменить: В соответствии с просьбой, документация поведения 1.4, из книги 1.4 Red-Bean, Фильтрация истории репозитория

Кроме того, скопированные пути могут вызвать некоторые проблемы. Subversion поддерживает операции копирования в хранилище, где создается новый путь путем копирования уже существующего пути. Вполне возможно, что в какой-то момент времени существования вашего репозитория вы могли скопировать файл или каталог из какого-то svndumpfilterисключающего местоположения, в то же самое, что и оно. Чтобы сделать данные дампа самодостаточными,svndumpfilterНеобходимо по-прежнему показывать добавление нового пути, включая содержимое любых файлов, созданных копией, и не представлять это добавление как копию из источника, которого не будет в потоке данных отфильтрованного дампа. Но поскольку формат дампа хранилища Subversion показывает только то, что было изменено в каждой ревизии, содержимое источника копирования может быть недоступно. Если вы подозреваете, что у вас есть какие-либо копии такого рода в вашем хранилище, вы можете переосмыслить свой набор включенных / исключенных путей, возможно, включая пути, которые также служили источниками ваших проблемных операций копирования.

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


Почему бы "svn move" не было бы достаточно? Ваше предложение похоже на то, чтобы раздавить муху кувалдой.
Роб Уильямс

Меня укусило это поведение 1.4 - если репозиторий SVN содержит перемещения (переименования) каталогов или веток / тегов, использование svndumpfilter, чтобы помочь реорганизовать / перенести репозиторий в новую структуру, может дать сбой, поскольку он не обрабатывает историю хорошо. Это задокументировано, я откопаю ссылку. если хотите
Кен Нежный

Не могли бы вы добавить ссылку на это поведение?
Jacco

2

Хотя приведенные выше ответы будут работать, они не являются лучшей практикой. Последний трек svn server и client объединяет для вас. Svn знает, какие ревизии вы слили в ветку и откуда. Это очень помогает, когда ветка обновляется, а затем сливается обратно в ствол.

Независимо от того, какую версию Subversion вы используете, тем не менее, существует лучший метод возврата изменений в ветку в транк. Он описан в руководстве Subversion: Контроль версий с Subversion, Глава 4. Ветвление и слияние, Синхронизация ветвления .


Спасибо за официальную информацию, чтобы я мог слить ветку в ствол по официальному согласованию. Ключевое слово реинтеграции
июня

-3

Это действительно странная / необычная конфигурация в SVN, даже я думаю, что это вовсе не «хорошая практика», во всяком случае, я думаю, вы могли бы сделать что-то вроде:

  • Оформить заказ на все исходное дерево (svn co therootsourcetree)
  • Снять багажник (svn rm багажник)
  • Скопируйте ветку в ствол (svn cp ветки / ветвь / ствол)
  • Удалить ветку (svn rm ветки / ветка)
  • Зафиксируйте изменения

Удачи


9
Это уничтожает след истории, который будет сохранен "svn move".
Роб Уильямс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.