Видаліть усі локальні набори змін і поверніться до дерева


95

Я використовую Mercurial, і я потрапив у жахливу халепу з трьома головами. Я не можу натиснути, і я просто хочу видалити всі мої локальні зміни та коміти та почати спочатку з абсолютно чистим кодом та чистою історією.

Іншими словами, я хочу закінчити (а) точно таким самим кодом локально, що існує на кінчику віддаленої гілки, і (б) відсутністю історії будь-яких локальних комітів.

Я знаю, що hg update -Cзамінює будь-які місцеві зміни. Але як мені видалити будь-які локальні коміти?

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


Відповіді:


129

Коли найпростіший спосіб (новий hg clone) не є практичним, я використовую hg strip:

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

Повторюйте, поки не hg outgoingзалишиться тихим. Зверніть увагу, що hg strip $revзнищує $revі всіх його нащадків.

Зверніть увагу, що, можливо, вам доведеться спочатку увімкнути stripу своїх параметрах Mercurial .

PS: ще розумніший підхід полягає у використанні мови revset і виконуємо:

% hg strip 'roots(outgoing())'

1
Дякую! Я потрапив у ситуацію, яку це вирішило ідеально, без жодної суєти.
eswald

1
Це врятувало мене від великих виправлень вище, дуже просто, дякую!
David C

3
Якщо хтось має проблеми hg strip 'roots(outgoing())'з роботою через те, що він не визнає 'roots(outgoing())'. Я зміг змусити це працювати hg strip "roots(outgoing())".
jsea

@SombreErmine cmd.exe, так.
просто хтось

21

Ви захочете зробити локальний клон, де ви збережете лише набори змін, які також є у віддаленому сховищі. Використання TortoiseHg , hg logабо аналогічний малюнку , які з ваших змін є те , що Lastest правка НЕ робити (один перед бардак почався). Використання hg outgoingможе допомогти тут - воно перелічить усі набори змін, які ви зробили - виберіть номер редакції раніше, ніж будь-який із них.

Якщо викликається цільова ревізія goodта викликається ваш клон foo, виконайте такі дії:

hg clone -r good foo foo-clean

Це буде швидка локальна операція - немає причин завантажувати все знову . foo-cleanКлон буде містити тільки до ревізії , перегляду good. Тепер ви можете замінити foo-clean/.hg/hgrcз foo/.hg/hgrcтим щоб зберегти свої сховища локальної настройки , такі як по замовчуванням тягни / штовхай шлях до.

Коли ви переконаєтесь, що foo-cleanмає все необхідне foo, просто видаліть fooі перейменуйте foo-cleanна foo. Зробіть, hg pullщоб отримати нові набори змін з віддаленого сховища у ваш клон, і продовжуйте, як зазвичай.


Якщо ніхто не надсилав нові набори змін у віддалене сховище, то дуже просто визначити, яку редакцію ви хочете використовувати, як goodзазначено вище: hg id defaultскаже вам ідентифікатор підказки у віддаленому сховищі.


У мене така ж ситуація, але у мене також багато файлів у каталозі репо, але вони знаходяться у hgignore. Не вдається встановити hg strip і хотів би скинути локальні коміти, не замінюючи весь клон. Якісь ідеї? - Ага! Якщо я не додав жодних файлів, я міг би просто скопіювати інший клон у свій старий каталог !?
Пітер

Будьте обережні з цим методом, якщо у вас кілька гілок. Клонування до вказаної версії отримує лише набори змін у гілці вказаної редакції. Тоді вам, можливо, доведеться провести hg pull -rостанню "хорошу" ревізію кожної додаткової гілки.
Іц

9

Гаразд. Тож просто видаліть усі локальні матеріали, hg initнове місцеве сховище та hg pullостанню пораду, яка у вас є. Не забудьте hg updateпісля цього.


Дякую. Коли ви говорите "видалити всі локальні матеріали", ви маєте на увазі видалити все сховище або просто мої зміни? Що робить hg init (у Google, але я не бачу простого пояснення), і чи потрібно мені використовувати будь-які прапори з ним? Чи видалить такі речі, як мої налаштування Mercurial .hgrc?
Річард

Оновлення: якщо я видалю все, що знаходиться в кореневому каталозі проекту, то введіть 'hg init', я отримаю 'abort: repository. вже існує!'. Чи потрібно налаштовувати та працювати з нового каталогу? Я б не хотів, якщо це можливо ... безумовно, повинен бути простий спосіб убити все, що я зробив на місцях ?!
Річард

Так, видалити все, включаючи всі матеріали сховища. Почніть з нової чистої папки. Свої уподобання ви можете зберегти у файлі резервної копії, а потім відновити їх у новому сховищі, яке ви створили за допомогою hg init reponame. Детально про init та інше: hgbook.red-bean.com/read/mercurial-in-daily-use.html
alemjerus

6
alemjerus: hg init+ hg pull= hg cloneРізниця в тому, що hg cloneробить .hg/hgrcдля вас приємний файл і який hg cloneбуде використовувати жорсткі посилання, щоб заощадити місце під час клонування в тій самій файловій системі.
Martin Geisler

Річард: Результат hg help initтут: selenic.com/mercurial/hg.1.html#init Але, можливо, це занадто стисло? Якщо вам потрібна додаткова допомога, надішліть листа на наш розсильний список! Див .: mercurial.selenic.com/wiki/MailingLists
Мартін Гейслер

5

Ви можете використовувати

перегляд смуги hg - -

щоб убити будь-яку редакцію та її піддерево у вашому локальному сховищі.

https://www.mercurial-scm.org/wiki/Strip

Але не намагайтеся використовувати його для чогось, що вже було просунуто.


Ви можете використовувати його під час загальнодоступної версії, але якщо ви знову потягнете, вона з’явиться знову. (hg strip працює лише з локальним сховищем.)
Майк Рософт

2

Просто видаліть усе, що є у вашій локальній системі, і повторно клонуйте віддалений репо.


2
hg strip `hg out --template" {rev} {author} \ n "| grep YOUR_AUTHOR_NAME | вирізати -d "" -f 1`

робить трюк для мене.

Він видаляє всі версії, які не надсилаються до сховища за замовчуванням, створеного з вашим іменем автора.

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

hg strip `hg out OTHER_REPO_ALIAS - шаблон" {rev} {автор} \ n "| grep YOUR_AUTHOR_NAME | вирізати -d "" -f 1`

0

Якщо ви використовуєте TortoiseHg, один простий спосіб вийти з (маленького) безладу - це спочатку оновити останню редакцію, потім вибрати набори змін і ініціювати "злиття з локальним". Коли з'явиться діалогове вікно злиття, просто натисніть маленький значок "+", щоб відкрити деякі додаткові параметри, одним з яких є "скасувати набори змін із цільової (іншої) версії злиття". Це буде означати, що ваші набори змін все ще будуть у репо та будуть підштовхуватися, але не матимуть ефекту, оскільки вони будуть відкинуті під час злиття. Якщо у вас є багато наборів змін, що охоплюють багато голов, ви, можливо, не захочете забруднювати репо таким чином, але це просте виправлення, яке варто розглянути, якщо набори змін, які ви відкидаєте, містять дані, на які згодом ви можете посилатися.

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