Як я можу відновити видалений файл у Mercurial (якщо він взагалі є)?


100

Випадково, використовуючи графічний інтерфейс на відміну від CLI, я видалив кожен файл проекту Mercurial.

Я відновився з Revert ok і втратив деяку роботу, яку, маючи машину часу, я міг легко повернути назад. Але чи існує спосіб видалення / відновлення таких файлів? Пробирався через посібник і гугл, але нічого не бачить. Будь-які плагіни?

Я, мабуть, відповідаю на моє власне запитання тут, але файли пішли з каталогу і не потрапили в кошик для відновлення, тож я припускаю, що Видалити безповоротно?

ps Я знаю, що hg forgetабо hg remove -Afвидаляю, не видаляючи з каталогу, але моє запитання пов'язане з помилкою, яку я зробив, на відміну від круто продуманого дії через.


1
ви маєте змогу перевірити старішу версію та бути добре (звичайно, це працює лише у випадку, якщо ви не переписали історію)
tback

Проблема полягала в тому, що я здійснив зміни, змінив R (емовав). Тож після цієї послідовності так, у мене був попередній фіксатор, тому я повернувся до цього, і, як у мене є резервне копіювання у формі машини часу, я можу отримати останні зміни, а потім додати їх і потім зробити. Однак якби у мене не було резервного копіювання, зміни були б втрачені.
PurplePilot

1
Пов’язане запитання, яке дозволяє шукати тільки файли (швидко): stackoverflow.com/questions/1013550/…
Майкл Прайор

Відповіді:


152

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


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

від затемнення це можна зробити, клацнувши правою кнопкою миші файл Вибрати команду -> Повернутися
Еміль

3
Ще один спосіб знайти версію, що містить файл,hg log -I '**file.ext'
квітня

2
Просто FYI: Ви хочете, щоб номер редакції комітету, у якому є файл, а не той, який його видалив!
Лукаш Кнут

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для пошуку у всіх каталогах. Про це ви можете прочитати в « Паттерні імен файлів» . І скористайтеся цим посиланням, щоб дізнатися про нові специфікації відновлення .


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

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

4
Це вірно. Якщо ви хочете отримати зміни, які не були зроблені до видалення, вони втрачаються.
ataylor

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.