Mercurial: обновление до версии, но не изменение локальных файлов
Предположим, что в репозитории имеется 20 версий. Текущей версией записи является версия 10, а фактические локальные файлы основаны на последней версии 20. Я не хочу вступать в ветвь из ревизии 10. Я хочу продолжить ревизию 20.
В настоящее время я делаю это, чтобы скопировать все файлы из каталога версий, запустить hg update -C (который обновляет номер версии), удалить все файлы в каталоге репозитория, скопировать все файлы обратно, затем совершить. Вы можете сказать, что это раздражает и время расточительно. Есть ли способ обновить номер версии, но не изменить какой-либо локальный файл?
Спасибо заранее.
EDIT: существует много вариантов использования (в основном я использую TortoiseHg).
1) Я ошибочно выбираю "Нет", когда вам предлагается удалить файлы из репозитория во время фиксации. Я могу использовать полосу из mq, чтобы удалить ревизию, но это вернет все зарегистрированные файлы. Вместо этого я хочу "переименовать" предыдущую ревизию, снова зафиксировать, а затем удалить ненужную ревизию. Это может случиться с кем угодно в любое время, а не только я, а не только один раз.
2) У меня была машина для разработки A. Я запустил проект на ней и переключился на машину B через несколько месяцев. Код на A стареет, а код в B не изменяется. Если я хочу продолжить разработку на A, мне нужно скопировать код в через Flash или в сеть и т.д. Теперь я хочу зафиксировать A без разветвления (потому что код на A фактически основан на текущем кончике). Это происходит, может быть, реже, но все же не "один раз", и, возможно, при участии в большом проекте.
3) В репозитории есть 2 ветки C и D. Имеется примерно 2000 файлов. Текущий совет в C. Я хочу переписать некоторые файлы в D с теми же именами файлов на C (потому что C более реализован), сохраняя при этом другие файлы без изменений, а затем создайте новый отзыв в D. У меня есть несколько вариантов. Я мог бы обновиться до D, сравнить последнюю ревизию D с текущим кончиком, внести изменения и зафиксировать. Обновление потребуется некоторое время, и сложность сравнения в значительной степени зависит от инструмента сравнения. Я мог бы также сначала сравнить, внести изменения, создать резервную копию всего каталога, обновить до D, а затем восстановить весь каталог. Это еще более громоздко. Но если я могу "переименовать" в D, мне просто нужно внести изменения и совершить. Это не зависит от инструмента сравнения, поскольку окно фиксации в TortoiseHg имеет список различий.
Если вы хотите думать, может быть больше случаев использования. Надеюсь, Mercurial предоставляет такую функцию "переименования" (предположительно новую опцию для обновления hg) или, по крайней мере, удобную альтернативу.
Ответы
Ответ 1
Вы можете найти эту статью полезной. Исходная ссылка больше не существует, поэтому теперь она ссылается на копию интернет-архива:
https://web.archive.org/web/20170805042314/http://hgtip.com/tips/advanced/2010-04-23-debug-command-tricks
В частности, чтобы "переоткрыть" ваш текущий рабочий каталог, введите:
hg debugsetparent 20
hg debugrebuildstate
Ответ 2
Вы можете использовать hg debugsetparents
, чтобы установить родительскую ревизию вашей рабочей копии.
Ответ 3
По умолчанию hg update
уже сохранит ваши незафиксированные изменения. Поэтому после hg update
вы все равно увидите свои незафиксированные изменения в hg status
и hg diff
. Нет необходимости копировать файлы из рабочей копии и обратно.
Тем не менее, может быть безопаснее просто зафиксировать ваши изменения как ветку ревизии 10. Таким образом, ваши изменения будут безопасно записаны. Затем вы можете выполнить merge или rebase с пересмотром 20 в отдельной фиксации без необходимости беспокоиться о том, что вы потеряете что-то во время работы по разрешению конфликтов.
FYI есть опции, которые изменяют поведение по умолчанию hg update
, как описано в hg update documentation. --check
или -c
откажется обновить, если у вас есть незафиксированные изменения. --clean
или -c
(то, что вы использовали до сих пор) выкинет любые незафиксированные изменения.