Как мне восстановить удаленный файл в Mercurial (если вообще)?


101

Случайно, используя графический интерфейс, а не интерфейс командной строки, я удалил все файлы в проекте Mercurial.

Я восстановился с помощью Revert ok и потерял часть работы, которую, поскольку у меня есть машина времени, я мог легко вернуть. Но есть ли способ удалить / восстановить такие файлы? Перелистал мануал и погуглил, но ничего не видит. Есть плагины?

Я, вероятно, отвечаю на свой вопрос здесь, но файлы исчезли из каталога и не были в корзине для восстановления, поэтому я предполагаю, что удаление невозможно отменить?

ps Я знаю это hg forgetили hg remove -Afудаляю без удаления из каталога, но мой вопрос связан с ошибкой, которую я сделал, а не с крутым обдумыванием действия.


1
у вас должна быть возможность проверить более старую ревизию и все будет в порядке (конечно, это работает только в том случае, если вы не переписывали историю)
tback

проблема заключалась в том, что я совершил, внес правки, R (удалено). Итак, после этой последовательности да, у меня была предыдущая фиксация, поэтому я вернулся к ней, и поскольку у меня есть резервная копия в виде машины времени, я могу получить последние изменения, затем добавить их, а затем зафиксировать. Однако, если бы у меня не было резервной копии, изменения были бы потеряны.
PurplePilot

1
Связанный вопрос, который позволяет вам искать только имена файлов (быстро): stackoverflow.com/questions/1013550/…
Майкл Прайор,

Ответы:


153

Сначала используйте hg grepдля поиска удаленного файла, который хотите восстановить. Вывод этой команды покажет вам последнюю ревизию, для которой существовал файл, и путь к удаленному файлу. Во-вторых, запустите hg revert -r <revision number> <path to deleted file> . Удаленный файл теперь будет в вашей рабочей копии, готовый к повторной фиксации в голове.


5
хорошо работал для меня, спасибо. искал ответ на вопрос "как восстановить файл, который я намеренно удалил?"
нк.

из eclipse это можно сделать, щелкнув правой кнопкой мыши файл Select Team -> Revert
Emil

3
Другой способ найти ревизию, содержащую файл,hg log -I '**file.ext'
mpen

2
Просто к сведению: вам нужен номер ревизии коммита, в котором все еще есть файл, а НЕ тот, который его удалил!
Lukas Кнут

8

Цитата из комментария:

Я создал репозиторий, зафиксировал все, удалил, а затем снова зафиксировал

В этом случае вам просто нужно обновить рабочий каталог до предыдущей версии:

$ hg update -C -r-2

Обратите внимание на отрицательный номер версии. Если файлы, которые вы удалили, не относятся к предыдущей версии, вы можете найти их, используя:

$ hg log -v


4

Для Mercurial 1.6 и выше

Если вы знаете имя удаляемого файла, вы можете легко найти его версию:

hg log -r "removes('NAME.c')"

Это даст вам ревизию, в которой будет удален файл с именем NAME.c (в корне).

Затем вы можете вернуть файл к предыдущей версии (как и другие ответы):

hg revert -r <revision number> <path to deleted file>

Вместо этого вы можете использовать шаблон имени файла, чтобы приспособиться к тому, что вы знаете, например, вы можете использовать его **/NAME.cдля поиска во всех каталогах. Вы можете прочитать об этом в разделе «Шаблоны имен файлов» . И используйте эту ссылку, чтобы узнать о новых спецификациях revset .


1

Дополнение к принятому ответу - это быстрее, если вы хотите отменить все удаления в фиксации. Я удалил большую папку с несколькими сотнями файлов и сделал это 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.


0

Вы можете отменить последнюю фиксацию репо с помощью hg rollback. Доступен только один уровень отката, поэтому, если вы выполнили удаление с более чем одной фиксацией, это не отменит полностью ваше изменение. Это работает только в вашем локальном репозитории, поэтому, если вы нажали, вы не сможете отменить его в удаленном репозитории.


1
Нет, это не работает. Я использую Mac с Mercurial Distributed SCM (версия 1.4.1 + 20091201). Я создал репозиторий, зафиксировал все, удалил, а затем снова зафиксировал, но это возвращает только список файлов, помеченных как R (удалено), но фактически не возвращает файлы. Если я помечу файлы как R (смонтированы) и откат перед фиксацией, ничего не произойдет.
PurplePilot

После того, как вы выполнили откат hg, ваше репо будет откатано, но в вашем текущем рабочем каталоге все равно останутся ваши изменения. Просто скажите hg выполнить чистое обновление для откатанной ревизии, теперь на подсказке: hg up -C.
ataylor 02

1
hg rollbackне будет восстанавливать удаленный файл, потому что удаление файла не является частью транзакции фиксации.
mrucci

4
Это правильно. Если вы хотите получить правки, которые не были внесены до удаления, они будут потеряны.
ataylor 03

0

Вы можете удалить подтвержденные исправления, используя hg strip команды, предоставляемой расширением mq (Mercurial Queues). Это должно вернуть вам ваши файлы.

Сделайте резервную копию, прежде чем попробовать это, потому что это изменит базу данных изменений Mercurial.


0

Приведенный ниже метод прост и настолько глуп, что не может пойти не так. Если вы удалили или переименовали несколько файлов, все будет в порядке.

hg clone mydirectory mydirectory1

и теперь вы запускаете mc (или Far Manager) и сравниваете то, что было, с тем, чем стало.

когда это будет сделано, просто удалите mydirectory1.


0

Следующее сработало для меня.

hg revert -r <Revision Number> <File Name>

(Необязательно, чтобы вернуть все файлы)

hg revert -r <Revision Number> --all
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.