Mercurial: Чи можна перейменувати філію?


204

Зараз у нас є «стигентна» гілка, де «постановка», здається, набагато краща семантична відповідність. Яка хороша стратегія для вирішення цього питання?

Відповіді:


223

Оновіться до stigingгілки та створіть нову гілку від неї. Потім закрийте стару гілку.

Підсумовуючи:

hg update stiging
hg branch staging
hg commit -m"Changing stiging branch to staging."
hg update stiging
hg commit --close-branch -m"This was a typo; use staging instead."
hg push --new-branch

1
Це найкращий спосіб зробити це, що я знайшов. Закриття гілки не дозволяє іншим випадково використовувати її, оскільки вона не відображається у висновку "hg гілок". Він все ще дозволяє отримати доступ до нього пізніше, якщо ви знаєте ім'я.
Посуд

2
Чи дозволить Mercurial повторно використовувати ім’я закритої філії? Тобто, якщо у вас є гілка v3, чи можете ви використовувати техніку вище, щоб перейменувати її на v4, а потім розщелити нову гілку v3, незважаючи на те, що ви залишили позаду закриту v3?
Джошуа Голдберг

4
@JoshuaGoldberg, 3noch помиляється. Mercurial буде дозволяє повторно використовувати ім'я закритої гілки, якщо ви використовуєте --force. Наприклад: hg branch --force v3. Це призведе до hg update v3оновлення до нової v3гілки, як ви цього хотіли.
Гілі

2
підтвердив @ коментар Джилі з довідкою hg: "- примушуйте встановити ім'я гілки, навіть якщо вона затінює існуючу гілку"
Джошуа Голдберг

7
Якщо ви закриєтесь stigingперед розгалуженням, ви не отримаєте "вільний кінець"
max.mustermann

60

Для майбутніх читачів: за допомогою rebaseрозширення ви можете створити нову гілку з тим самим батьківським середовищем, що stigingй перенести на неї всю історію філії, як це:

hg update -r "parents(min(branch('stiging')))"
hg branch staging
hg commit
hg rebase --source "min(branch('stiging'))" --dest staging

Це передбачає, що stigingмає лише одного з батьків. Звичайно, ви можете просто використовувати явні номери версій замість цього.

Примітка 1: Якщо гілка stigingвключає злиття з іншими гілками, я думаю, що це збереже їх до тих пір, поки stagingі stigingматиме того ж батьківського складу. Але я б точно перевірив.

Примітка 2: Оскільки це редагує історію, стара гілка не просто зникне з клонованих сховищ (див. rebaseДокументацію). Якщо кожен не може клонуватись заново, це може бути не дуже практичним рішенням для великої групи.

Примітка 3 / Редагування (люб’язно надано @JasonRCoombs): Тепер, коли фази є стандартними у рутинах, rebaseвідмовляться змінювати набори змін, які вже були натиснуті. Або обдуріть це, змінивши фазу назад на чернетку (з hg phases), або нехай стара гілка залишиться там, де вона є, і просто зробіть належну назву копії (наприклад, з `hg rebase --keep ').


+1 для невеликих команд, де ви можете змусити користувачів клонувати це - хороша ідея - або використовувати hg convertзамість цього.
hochl

5
З пізніми версіями Mercurial команда rebase завершиться невдачею, якщо зміни, які потрібно перемістити, не будуть "відкритими". Або змушуйте їх складати проект (з фазами hg) або переходити --keepдо команди rebase, яка буде копіювати замість переміщення змін.
Джейсон Р. Кумбс

На етапі 4: abort: can't rebase immutable changeset 11b1e2b7dc4f. Зауважте, що я наніс набори змін з іншої гілки на цю. Крім того, він розщеплюється і зливається безкоштовно.
Марк Єронімус

@ Марк, погляньте на Примітку 3 вище.
alexis

6
Замість того, щоб здійснити набір змін у новій гілці, а потім повторно звільнити її, ви можете опустити це і використовувати .для свого --destзначення, а ребаза автоматично прийме нову назву гілки.
weberc2

16

Якщо у вас є набори змін, вам доведеться використовувати розширення для перетворення за допомогою гілки для перейменування. Кожен повинен буде клонувати нове репо або позбавити стару гілку.


1
Це цікаве рішення, чи можете ви детальніше розробити?
DrM

15

Створіть нову гілку під назвою "постановка" і забудьте іншу ...


+1 це те, що я б робив. У старих наборів змін все ще буде стара назва гілки, але нові матимуть нову назву гілки.
barjak

6

Це змінює історію і призначене лише для досвідчених користувачів Mercurial. Не робіть цього, якщо ви не знаєте, що це означає.

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

hg update {SHA-1 of the ancestor changeset}
hg branch staging
hg graft {first changeset in stiging} ... {stiging head-1} {stiging head}
hg strip {first changeset in stiging}
hg push --new-branch

1
Для кроку 3 можна скористатисяhg graft {first changeset in stiging}..{stiging head}
KCD
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.