Как восстановить удаленный файл в Mercurial (если вообще)?
Случайно, используя GUI в отличие от CLI, я удалял каждый файл в проекте Mercurial.
Я восстановился с Revert ok и потерял некоторую работу, которая, поскольку у меня есть машина времени, я мог бы легко вернуться. Но есть ли способ удалить или восстановить такие файлы? Пробирается через ручное и googled, но ничего не видит. Любые плагины?
Я, вероятно, отвечаю на свой собственный вопрос здесь, но файлы исчезли из каталога и не были в корзине для восстановления, поэтому я предполагаю, что удаление является безотзывным?
p.s. Я знаю, что hg forget
или hg remove -Af
удаляется без удаления из каталога, но мой вопрос связан с ошибкой, которую я сделал, в отличие от того, чтобы охладить мышление с помощью действия.
Ответы
Ответ 1
Сначала используйте hg grep
, чтобы найти удаленный файл, который вы хотите восстановить. Результат этой команды покажет вам последнюю ревизию, для которой был файл, и путь к удаленному файлу.
Во-вторых, запустите hg revert -r <revision number> <path to deleted file>
Удаленный файл теперь будет в вашей рабочей копии, готовый к возврату в голову.
Ответ 2
Цитата из комментария:
Я установил репозиторий, все зафиксировал, удалил и затем снова зафиксировал
Если это так, вам просто нужно обновить рабочий каталог до предыдущей версии:
$ hg update -C -r-2
Обратите внимание на отрицательный номер ревизии. Если удаленные файлы не находятся в предыдущей версии, вы можете найти их, используя:
$ hg log -v
Ответ 3
Для Mercurial 1.6 и выше
Если вы знаете имя файла удаления, вы можете легко просмотреть его версию:
hg log -r "removes('NAME.c')"
Это даст вам ревизию в том, что файл NAME.c(в корневом каталоге) удален.
Затем вы можете вернуть файл в предыдущую версию (например, другие ответы):
hg revert -r <revision number> <path to deleted file>
Вместо этого вы можете использовать шаблон имени файла, чтобы адаптироваться к тому, что вы знаете, например, вы можете использовать **/NAME.c
для поиска во всех каталогах. Вы можете прочитать об этом в File Name Patters. И используйте эту ссылку, чтобы узнать о новых характеристиках замены.
Ответ 4
Хорошо, это сработало для меня.
hg revert -r revision pathToTheFile
Ответ 5
Добавление к принятому ответу - это быстрее, если вы хотите отменить все удаления в фиксации. Я удалил большую папку с несколькими сотнями файлов в ней и сделал 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
на данный момент.
Ответ 6
Вы можете отменить последнюю фиксацию на репо с помощью hg rollback
. Доступен только один уровень отката, поэтому, если вы сделали удаление с более чем одной фиксацией, это не полностью отменяет ваши изменения. Это работает только в вашем локальном репозитории, поэтому, если вы нажали, вы не сможете отменить его в удаленном репо.
Ответ 7
Вы можете удалить исправленные версии с помощью команды hg strip
, которая предоставляется расширением mq (Mercurial Queues). Это должно вернуть ваши файлы.
Сделайте резервную копию, прежде чем пытаться это выяснить, потому что она изменит Mercurial базу данных наборов изменений.
Ответ 8
Этот метод является простым и настолько глупым, что он не может пойти не так.
Если вы удалили или переименовали несколько файлов, это будет нормально.
hg clone mydirectory mydirectory1
и теперь вы запускаете mc (или Far Manager) и сравниваете то, что было против того, чем он стал.
когда это будет сделано, просто удалите mydirectory1
.