Отменить все и получить чистую копию последней ревизии?


159

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

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

В настоящее время я делаю это:

hg revert --all
<build command here to delete the contents of the working directory, except the .hg folder.>
hg pull
hg update -r MY_BRANCH

но похоже, что должен быть более простой способ.

Я хочу сделать то же самое, что удалить репо, сделать свежий клон и обновить. Но репо слишком велико, чтобы быть достаточно быстрым.


1
Является ли "(удалить содержимое ...)" комментарием к команде "revert --all" или шагом, который вы выполняете? Я спрашиваю, потому что "hg update" будет обновлять только файлы, которые изменились. Если вы удалите другие файлы перед обновлением, вы не получите их обратно, пока не вернетесь к null-revision ( hg update 00), а затем вернетесь к подсказке. Почему hg revert --allнедостаточно вернуться в согласованное рабочее состояние папки перед извлечением и обновлением?
Лассе В. Карлсен

это отдельный шаг, сделанный с моим программным обеспечением для сборки. (Я мог бы просто использовать удаление из командной строки, но не сделал этого.)
Рори

1
Вы можете найти эту archiveкоманду полезной в будущем. Например, вы можете hg archive ../newbuild, и снимок вашего хранилища в последний раз hg updateбудет размещен там. Обычно я делаю это для ночных сборок, чтобы не рисковать своим репо. Просто удалите каталог сборки, когда он вам больше не нужен.
Тим Пост

Ответы:


212

Эти шаги должны быть сокращены до:

hg pull
hg update -r MY_BRANCH -C

-CФлаг указывает команду обновления , чтобы отменить все локальные изменения перед обновлением.

Тем не менее, это может по-прежнему не отслеживать файлы в вашем хранилище. Похоже, вы тоже хотите избавиться от них, поэтому я бы использовал purgeрасширение для этого:

hg pull
hg update -r MY_BRANCH -C
hg purge

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


6
Спасибо, мне нужна была «чистка». Обновление -C не избавляет от неотслеживаемых файлов, и это главное, с чем я боролся.
Рори

4
Вы также можете использовать TortoiseHg для очистки. Вам просто нужно включить расширение в настройках рабочего места (или отредактировать mercurial.ini).
Дэйв

18
Если расширение очистки не активировано, вы также можете использовать следующую команду: hg --config "extensions.purge=" purge --all
Сэмюэль Делисл

6
@ csharptest.net hg purge --allтолько что доставил мне сильную головную боль, поскольку он также стер мои локальные настройки, а именно: пользователя базы данных / пароль и т. д. :)
VMC

@SamuelDelisle спасибо, сэр, я не хотел вносить какие-либо изменения в конфигурацию только для этой одноразовой команды в моем скрипте!
joonas.fi

113
hg up -C

Это удалит все изменения и обновит до последней главы в текущей ветке.

И вы можете включить расширение очистки, чтобы иметь возможность удалять все неверсированные файлы тоже.


Это включает в себя неотслеживаемые файлы? У меня были некоторые проблемы с другими командами, которые я пробовал. Я попробую сейчас ...
Рори

7
@Rory: нет, hg purgeдля неверсированных файлов.
zerkms

10

Для удаления неотслеживаемого на * nix без расширения purge вы можете использовать

hg pull
hg update -r MY_BRANCH -C
hg status -un|xargs rm

Который использует

обновление -r --rev REV редакция

update -C - очистить отмененные незафиксированные изменения (без резервного копирования)

status -u --unknown показать только неизвестные (не отслеженные) файлы

status -n --no-status скрыть префикс статуса


4

Если вы ищете простой метод , то вы можете попробовать это.

Я сам не могу запомнить командные строки для всех своих инструментов, поэтому я стараюсь делать это с помощью пользовательского интерфейса:


1. Сначала выберите «совершить»

совершить

2. Затем отобразите проигнорированные файлы. Если у вас есть незафиксированные изменения, скрыть их.

Показать проигнорированные файлы

3. Теперь выберите все из них и нажмите «Удалить Unversioned».

Удалить их

Готово. Это процедура, которую гораздо проще запомнить, чем командную строку.


Я не уверен (я использую SourceTree сам), но эти скриншоты, кажется, от TortoiseHg Workbench. В целом, я думаю, что решения на основе пользовательского интерфейса полезны, но этот ответ требует лучшей маркировки. Кроме того, «скрыть их» звучит для меня немного расплывчато.
Джон Кумбс

3

статус рт.ст. покажет вам все новые файлы, а затем вы можете просто ете их.

Обычно я хочу избавиться от игнорируемых и неверсионных файлов, поэтому:

hg status -iu                          # to show 
hg status -iun0 | xargs -r0 rm         # to destroy

И затем следуйте этому с:

hg update -C -r xxxxx

который помещает все версионные файлы в правильное состояние для ревизии хххх


Чтобы следовать традиции переполнения стека, говоря вам, что вы не хотите этого делать, я часто обнаруживаю, что этот «ядерный вариант» уничтожил вещи, которые мне небезразличны.

Правильный способ сделать это - использовать опцию «make clean» в процессе сборки, а также, возможно, «make realclean» и «make distclean».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.