svn: замінити стовбур гілкою


155

Який найкращий спосіб зробити одну з гілок сховища підривної системи новим стовбуром?

Була основна перезапис для всієї системи: речі переміщені, переписані, замінені, видалені, перейменовані тощо. Переписаний код був перевірений і готовий замінити старий багажник.

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

Багажник (1) -> Багажник (2) -> Багажник (5) -> × + -> новий багажник (7)
  \ \ |
  вилка злиття ???
    \ \ |
     + -> Відділення (3) -> Відділення (4) -> Відділення (6) - +

Усі поточні зміни зі старого "Магістрального" вже включені до "Переписаної гілки"

Як я можу це зробити?

Відповіді:


118

За допомогою переміщення svn перемістіть вміст старого стовбура кудись інше та перейменуйте гілку на стовбур згодом.

Зауважте, що копіювання та переміщення у 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-deddry trunk-url гілка-url

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

Це не намагається застосувати зміни історично (підтримуючи зміни в магістралі). Він просто "застосовує різницю" між стовбуром і гілкою. Це не створить конфліктів для ваших користувачів у файлах, які не були змінені. Однак ви втратите свою історичну інформацію з гілки, але це станеться, коли ви все одно перетворите злиття.


1
Опублікувати svn 1.5, ви повинні мати змогу робити злиття, що зберігають історію.
NSherwin

9

Рекомендую вносити ці зміни за допомогою інструмента браузера сховища.

Спроба великих операцій видалення + переміщення за допомогою робочої копії - чудовий спосіб вбити робочу копію. Якщо ви змушені використовувати робочу копію, виконайте додаткові зобов’язання після кожної операції видалення або переміщення та ОНОВНІТЬ свою робочу копію після кожного виконання.


Посилання на Repo було б зручним (просто для зручності - збережіть пошук у Google) :)
Брайан М. Хант

3
Вибачте. Написання написало так, що я мав на увазі конкретний інструмент (відредагований). Насправді більшість інструментів графічного інтерфейсу SVN повинні мати функцію браузера сховища. FYI: Я використовую черепаховий черепах.tigris.org
Chris Nava

4

Якщо ви хочете зробити гілку новим стовбуром (тобто) позбутися всіх змін в магістралі, які були внесені з моменту створення гілки, ви можете: 1. Створити гілку стовбура (для резервного копіювання) 2. "відновити зміни "на стволі (виберіть усі зміни після створення гілки. 3. Об'єднайте гілку назад до стовбура.

Історія повинна залишатися таким.

З повагою, Роджер


3

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

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

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

Звичайно, перед запуском створіть резервну копію наявного сховища.

Це зберігає історію, не записуючи переїзд / копію чітко і спрощує подальшу реорганізацію, зберігаючи історію.


Редагувати: За потребою, документація про поведінку 1.4, з книги 1.4 Red-Bean, « Фільтрування історії сховищ»

Також скопійовані контури можуть доставити вам певні проблеми. Subversion підтримує операції копіювання в сховищі, де створюється новий шлях шляхом копіювання деякого вже існуючого шляху. Цілком можливо, що в якийсь момент життя вашого сховища ви могли скопіювати файл або каталог з якогось місця, яке svndumpfilterвиключає, у місце, яке воно включає. Щоб зробити дані демпінгу самодостатніми,svndumpfilterпотрібно все ще показувати додавання нового шляху - включаючи вміст будь-яких файлів, створених копією - і не представляти це додаток як копію з джерела, який не буде існувати у вашому відфільтрованому потоці даних дампа. Але оскільки формат дамп-сховища сховища Subversion показує лише те, що було змінено в кожній редакції, вміст джерела копіювання може бути недоступним. Якщо ви підозрюєте, що у вашому сховищі є якісь подібні копії, ви можете переосмислити свій набір включених / виключених шляхів, можливо, включаючи шляхи, які також послужили джерелами ваших клопітних копіювальних операцій.

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


Чому б "переміщення svn" було б недостатньо? Ваша пропозиція, схоже, накручує мушку кувалдою.
Роб Вільямс

Мене покусало таке поведінка 1.4 - якщо сховище SVN містить ходи (перейменування) каталогів або гілок / тегів, використання svndumpfilter для реорганізації / переміщення сховища до нової структури може вийти з ладу, оскільки воно не обробляє історію Ну. Це задокументовано, я викопаю посилання. якщо вам подобається
Ken Gentle

Чи можете ви додати посилання на таку поведінку?
Жако

2

Хоча відповіді вище будуть працювати, вони не є найкращою практикою. Для вас зливається найновіший сервер і доріжка клієнта. Тож svn знає, які редакції ви об’єднали у гілку та звідки. Це дуже допомагає при оновленні гілки, а потім об'єднанні її назад у стовбур.

Незалежно від того, яку версію Subversion ви використовуєте, однак існує найкращий метод для повернення змін у гілку назад у стовбур. Це викладено в посібнику з Subversion: Контроль версій з Subversion, Глава 4. Розгалуження та об'єднання, зберігання гілки в синхронізації .


Thx для офіційної інформації, щоб я міг об'єднати гілку до стовбура за офіційним дозволом. Ключове слово возз'єднувальний
Junyo

-3

Це дійсно дивна / незвичайна конфігурація у SVN, навіть я думаю, що це далеко не "хороша практика", так чи інакше, я думаю, ви могли б зробити щось на кшталт:

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

Удачі


9
Це знищує слід історії, який би зберігся "svn ход".
Роб Вільямс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.