Mercurial: обновить до ревизии, но не изменять локальные файлы - PullRequest
13 голосов
/ 14 декабря 2010

Предположим, в хранилище 20 ревизий. Текущей версией записи является ревизия 10 , тогда как фактические локальные файлы основаны на последней ревизии 20 . Я не хочу переходить с ревизии 10 . Я хочу продолжить ревизию 20 .

В настоящее время я копирую все файлы из каталога ревизий, запускаю hg update -C (который обновляет номер ревизии), удаляет все файлы в каталоге репозитория, копирует все файлы обратно, затем совершить. Вы можете сказать, что это раздражает и тратит время. Есть ли способ только обновить номер ревизии, но не изменять какой-либо локальный файл?

Заранее спасибо.

РЕДАКТИРОВАТЬ : есть много вариантов использования (я в основном использую TortoiseHg).

1) Я по ошибке выбираю «Нет», когда мне предлагают удалить файлы из репозитория во время коммита. Я могу использовать полосу из mq, чтобы удалить ревизию, но это вернет все зафиксированные файлы. Вместо этого я хочу переопределить предыдущую ревизию, зафиксировать снова, а затем удалить нежелательную ревизию. Это может случиться с кем угодно в любое время, не только со мной, ни один раз.

2) У меня была машина для разработки A. Я запустил проект на ней и через несколько месяцев переключился на машину B. Код на A стареет, а код на B не передается, изменился. Если я хочу продолжить разработку на A, мне нужно скопировать код на A через Flash или по сети и т. Д. Теперь я хочу зафиксировать на A без разветвления (потому что код на A фактически основан на текущей подсказке). Это случается, может быть, реже, но все же не является проблемой «один раз», а более вероятно, когда участвует в большом проекте.

3) Хранилище имеет 2 ветви C и D. В нем примерно 2000 файлов. Текущий совет находится в C. Я хочу перезаписать некоторые файлы в D файлами с таким же именем в C (потому что C более реализован), сохраняя при этом другие файлы без изменений, а затем создать новый совет в D. У меня есть несколько вариантов. Я мог бы обновить до D, сравнить последнюю версию D с текущей подсказкой, внести изменения и зафиксировать. Обновление займет некоторое время, и сложность сравнения в значительной степени зависит от инструмента сравнения. Я также мог сначала сравнить, внести изменения, сделать резервную копию всего каталога, обновить его до D, а затем восстановить весь каталог. Это еще более громоздко. Но если бы я мог «переучиться» к D, мне просто нужно внести изменения и зафиксировать. Это не зависит от инструмента сравнения, потому что окно фиксации в TortoiseHg имеет список различий.

Там может быть больше вариантов использования, если вы хотите думать. Я надеюсь, что Mercurial предоставляет такую ​​функцию «переопределения» (предположительно, новую опцию для обновления hg) или, по крайней мере, удобную альтернативу.

Ответы [ 3 ]

16 голосов
/ 15 декабря 2010

Вы можете найти это полезным: http://hgtip.com/tips/advanced/2010-04-23-debug-command-tricks/

В частности, чтобы «перечитать» текущий рабочий каталог, введите:

hg debugsetparent 20
hg debugrebuildstate
5 голосов
/ 14 декабря 2010

Вы можете использовать hg debugsetparents для установки родительской версии вашей рабочей копии.

2 голосов
/ 14 декабря 2010

По умолчанию hg update уже сохранит ваши незафиксированные изменения.Таким образом, после hg update вы все равно увидите свои незафиксированные изменения в hg status и hg diff.Нет необходимости копировать файлы из вашей рабочей копии и обратно.

Тем не менее, может быть безопаснее просто зафиксировать ваши изменения как ветку ревизии 10. Таким образом, ваши изменения будут безопасно записаны.Затем вы можете выполнить merge или rebase с ревизией 20 в отдельном коммите, не беспокоясь о том, что вы что-то потеряете во время работы по разрешению конфликта.

FYI,Существуют опции, которые изменяют поведение hg update по умолчанию, как описано в документации hg update .--check или -c откажется от обновления, если у вас есть незафиксированные изменения.--clean или -C (то, что вы использовали до сих пор) отбросит все незафиксированные изменения .

...