Как восстановить удаленный файл в 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.