Как я могу восстановить удаленный файл в Mercurial (если вообще)?
случайно, используя графический интерфейс, а не CLI, я удалил каждый файл в проекте Mercurial.
я восстановился с Revert ok и потерял некоторую работу, которую, поскольку у меня есть машина времени, я мог бы легко вернуть. Но есть ли способ удалить / восстановить такие файлы? Пролистал руководство и погуглил, но ничего не вижу. Какие-нибудь Плагины?
Я, вероятно, отвечаю на свой собственный вопрос здесь, но файлы исчезли из каталога и не были в корзине, чтобы восстановить так Я предполагаю, что удаление является безотзывным?
p. s. Я знаю, что hg forget или hg remove -Af удалит без удаления из каталога, но мой вопрос связан с ошибкой, которую я сделал, а не с прохладным обдумыванием действия.
9 ответов:
во-первых, использовать
hg grepчтобы найти удаленный файл, который вы хотите восстановить. Вывод этой команды покажет вам последняя версия, для которой файл присутствовал, и путь к удаленному файлу. Во-вторых, бегитеhg revert -r <revision number> <path to deleted file>Удаленный файл теперь будет в вашей рабочей копии, готовой к фиксации обратно в голову.
цитата из комментария:
Я создал репозиторий, зафиксировал все, удалил и снова зафиксировал
Если это так, то вам просто нужно обновить рабочий каталог до предыдущей версии:
$ hg update -C -r-2обратите внимание на отрицательный номер редакции. если файлы, которые вы удалили нет в предыдущей версии, вы можете найти их с помощью:
$ hg log -v
для ртути 1.6 и выше
Если вы знаете имя файла удаления, вы можете легко найти его ревизию с помощью:
hg log -r "removes('NAME.c')"Это даст вам ревизию в Ведьме файл с именем NAME.c (в корне) удаляется.
затем вы можете вернуться к предыдущей версии с (как и другие ответы):
hg revert -r <revision number> <path to deleted file>вы можете использовать шаблон имени файла вместо того, чтобы адаптироваться к тому, что вы знаете, например, вы можете использовать
**/NAME.cto поиск во всех каталогах. Вы можете прочитать об этом в Имя Файла Скороговорки. И используйте эту ссылку, чтобы узнать о новом revset спецификации.
дополнение к принятому ответу-это быстрее, если вы хотите отменить все удаления в фиксации. Я удалил большую папку с несколькими сотнями файлов в ней и сделал
hg addremove, что вовсе не было моим намерением, поэтому пришлось отменить все эти удаления.используя найти удаленные файлы в истории Mercurial репозитория, быстро? + xargs + tr, верните все удаления версии -3 в версию из версии -4:
hg log -r -3 --template "{rev}: {file_dels}\n" | tr ' ' '\n' | xargs hg revert -r -4обратите внимание, что это не удастся, если любой из ваших файлы имеют пробелы в имени;http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html не похоже, что есть какие-либо шаблоны, где
{file_dels}разделить на\nна данный момент.
вы можете отменить последний коммит в репо с
hg rollback. Существует только один уровень отката, поэтому, если вы выполнили удаление с несколькими фиксациями, это не полностью отменит ваше изменение. Это работает только в вашем локальном репозитории, поэтому, если вы нажали, вы не сможете отменить его в удаленном РЕПО.
вы можете удалить зафиксированные ревизии с помощью
hg stripкоманда, которая предоставляется расширением MQ (Mercurial Queues). Это должно вернуть вам ваши файлы.сделайте резервную копию, прежде чем пытаться это сделать, потому что это изменит базу данных Mercurial наборов изменений.
этот метод прост и настолько глуп, что он не может пойти не так. Если вы удалили или переименовали несколько файлов, это будет нормально.
hg clone mydirectory mydirectory1и теперь вы запускаете mc (или Far Manager) и сравниваете, что это было против того, что он стал.
когда это будет сделано, просто удалить
mydirectory1.
следующее работало для меня.
hg revert -r <Revision Number> <File Name>(необязательно, чтобы вернуть все файлы)
hg revert -r <Revision Number> --all
Comments