Могу ли я восстановить удаленные файлы (отменить git clean -fdx)?


119

Я следовал инструкциям по созданию страниц github и забыл перейти в подкаталог git. В результате я просто уничтожил целый каталог документов с помощью git clean -fdx.
Как я могу исправить эту ужасную ошибку?


2
Я не знаю точно, но не думаю, что это возможно с git. Однако утилита восстановления файлов для вашей файловой системы может помочь.
static_rtti

9
Интересно, что книга сообщества Git также git clean -fdxбез предупреждения предполагает, что операция настолько опасна. Интересно, сколько людей безвозвратно уничтожили свои файлы этим, казалось бы, невинным предложением.
catpnosis

5
Обязательно проверьте, есть ли в вашей среде IDE «Локальная история», как в Eclipse или IntelliJ IDE. Это может сэкономить вам много душевных страданий из-за непреднамеренных git cleanзвонков. Также постарайтесь избавиться от привычки убирать без проверки. Создайте сценарий Powershell или Bash, который можно вызвать, который будет запускаться git clean -fdxnс запросом подтверждения, прежде чем вы действительно запустите невероятно разрушительную очистку.
Джош Берджесс,

Ответы:


129

Нет. Эти файлы исчезли.

(Только что проверил в Linux: git clean callsunlink() и заранее ничего не копирует.)


32
Если вы используете расширенную среду IDE, такую ​​как RubyMine, Eclipse и т. Д., Скорее всего, у нее будет локальная история удаленных файлов, и вы сможете их восстановить.
Усмань

1
@Usman в моем случае git cleanслучайно удалил отложенные изменения внутри .ideaскрытой папки, и меня спасла местная история!
emkman 09

2
Отличный совет от @Usman. С помощью Eclipse я мог вернуть свой файл с опцией «Восстановить из локальной истории ...»: i.imgur.com/XWNLOk5.gifv
brandizzi

1
На самом деле это ВОЗМОЖНО, но хакерским методом. Смотрите этот ответ: stackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/…
Just Shadow

4
В PyCharm вы также можете их восстановить. Щелкните правой кнопкой мыши папку, в которой они были, щелкните «Локальная история», найдите удаление и нажмите «Вернуть».
Хуанхо Конти

48
git clean -fdxn

Выполнит пробный прогон и покажет, какие файлы будут удалены, если вы запустите

git clean -fdx

(конечно, это полезно, только если вы знаете это заранее, но в следующий раз)


7
В дополнение к этому, -nработает с большинством команд git (и многими другими командами * nix).
Nick McCurdy


18

Нет. "Git clean -fdx" удалит все файлы и каталоги, которые git не отслеживает, из вашего рабочего каталога. Поскольку Git не отслеживает эти файлы, у него не будет резервных копий этих файлов. По крайней мере, обычно.

Если вы относительно недавно выполнили «git add» для одного из этих файлов (но прервали фиксацию), есть шанс найти его с помощью «git fsck --lost-found». Стоит попробовать, но не надейтесь слишком.

В будущем вам следует подумать о том, чтобы совершать несколько раз слишком часто, чем несколько раз слишком редко. Таким образом, у вас будет хотя бы локальная резервная копия, даже если вы не отправите эти коммиты на удаленный компьютер.


Настоящая проблема заключалась в том, что каталог также не должен был быть репозиторием. Оглядываясь назад на журнал, оказывается, что я забыл записать cd в новый каталог репо после mkdirэтого
Эрик

1
Вскоре после прочтения этого вопроса я написал патч для Git, который добавляет переменную конфигурации для резервного копирования каждого удаленного файла. Может быть, это может быть полезно другим? github.com/kusma/git/tree/work/clean-backup
kusma

1
Мне сегодня повезло !!! Благодаря "git fsck --lost-found". Я использовал следующее, чтобы получить ВСЕ изменения: git fsck | awk '{print $ 3}' | xargs git show | tee searchresults.log Поскольку мне нужен был весь файл, который я добавил, а затем удалил, я мог получить его из журнала. :)
Marcello de Sales

11

Как упоминал @kusma выше, если вам повезет (если вы когда-либо использовали "git add"), вы можете использовать следующее для извлечения всего объекта:

git fsck | awk '{print $3}' | xargs git show | tee searchresults.log

Таким образом, он будет искать все типы фрагментов, собирать все различия и добавлять в файл, из которого вы можете извлечь потерянный файл. В моем случае я потерял целый класс Java.


8

Если вы используете любую IDE Jetbrains, есть возможность просмотреть локальную историю файла. Если вы это сделали git clean, вы можете воссоздать файл, проверить локальную историю файла и восстановить его оттуда.

Работал у меня для одного файла. Для полного каталога я понятия не имею, как это сделать.


Создайте файл в том же месте с тем же именем. В IDE щелкните правой кнопкой мыши и выберите «Показать историю». Скопируйте и вставьте содержимое из него. Отличный совет @Rajesh. Спасибо.
deep

1
Я спасен. Спасибо.
Скотт

Нет необходимости , чтобы скопировать содержимое файла, просто щелкните правой кнопкой мыши файл и нажмите кнопку «Восстановить» , чтобы восстановить его обратно к этой версии (даже если вы удалили его)
n00b

7

У меня сегодня была эта проблема.

Как говорили другие, git не хранит файлы.

Единственный способ отменить это - использовать утилиту восстановления. Я использовал «extundelete» и восстановил все, но ваша файловая система может отличаться.


7

Если вы работаете над Eclipse, одним из возможных решений является восстановление из локальной истории Eclipse.


2
Я использую PyCharm, и местная история спасла меня
psychok7

1
То же самое и в IntelliJ IDEA!
arthurakay

RubyMine также имеет местную историю. спас меня!
Усмань

Все браузеры IntelliJ имеют локальную историю. К счастью. Я пользовался WebStorm и чуть не получил аневризму, прежде чем обнаружил ее. Прошло 3 дня из 12 часов рабочего дня, и я серьезно подумывал о том, чтобы выпить бутылку крепкого алкоголя на моем столе.
Джош Берджесс,

7

Собственно да ! Это возможно! Но без использования команд git.
Все, что нам нужно, это просто инструмент для восстановления файлов, такой как Recuva .
Просто укажите путь, по которому он был удален, и позвольте ему восстановить файлы.

Также вот несколько полезных примечаний по использованию этого приложения:

  1. Я настоятельно рекомендую вам установить этот флажок перед восстановлением файлов (когда удаленные файлы появляются в окне восстановления):
    Advanced Mode-> Options-> Actions-> Restore folder structure
    При этом все ваши файлы будут восстановлены с сохранением структуры папок, так что тогда это будет намного проще просто перетащите эту папку на путь, откуда она была удалена.
  2. Установить инструмент восстановления на USB-устройство гораздо предпочтительнее (из-за предупреждения ниже)
  3. При упоминании того, где восстановить файлы, не выбирайте тот же диск, с которого файлы были удалены (опять же из-за упомянутого ниже предупреждения), так как текущий восстановленный файл может перезаписать другой удаленный файл, который еще не восстановлен. Восстановление файлов на любой USB-накопитель - всегда хорошее решение.

Предупреждение! Как только вы потеряете (случайно удалите) какой-либо файл, старайтесь не трогать (добавлять / редактировать файлы) диск, с которого он был удален, чтобы повысить вероятность успешного восстановления. В противном случае вы можете полностью потерять этот файл.

Почему это работает: когда вы удаляете файл, на самом деле он не удаляется. Он просто помечен как «удаленный», поэтому в следующий раз, когда вы добавите / обновите файлы на тот же диск, эти старые файлы будут перезаписаны новыми. Но до тех пор, пока они не будут перезаписаны, все еще можно прочитать (и, конечно же, восстановить) файлы.


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

2

Я сделал это с кодом, который должен был добавить в свой репозиторий, и очистил с помощью -dfx и смог восстановить файлы.

Я пытался использовать debugfs, искать и ссылаться на inodes, testdisk и многие другие появляющиеся инструменты, но никто не нашел каталог, который эта дурацкая запись была стерта случайно.

Загрузите extundelete с sourceforge.
Вероятно, вам потребуется установить пакет e2fslibs-dev.
Выполнить

$ ./configure 
$ make 

Он сгенерирует двоичный файл для extundelete внутри папки src. В моем случае я ошибочно стер папку. назовем это ФУБАР

Я только что побежал:

$  sudo ./extundelete --restore-directory <full path to FOOBAR > <the partition> 


и он создал папку с именем RESTORED_FOLDERS


Вот Это Да! хотя при этом не удалось восстановить файл, который я хотел, это то, что я отмечу - определенно пригодится!
vyom

1

Если вы используете git с MSBuild, я создал цель, которая копирует все файлы, а затем это делает git clean -xdf. Таким образом, вы можете легко восстановить файл, если поймете, что удалили то, что не хотели удалять. Взгляните сюда: http://blog.3d-logic.com/2012/11/04/safe-git-clean-with-msbuild/


1

Если вы используете Mac и сделали резервную копию с помощью Time Machine, вы можете восстановить


0

К счастью, я допустил эту ошибку при использовании Windows 7. Зашел в корзину, выделил все удаленные файлы и нажал «Восстановить». Готово.


6
Что вы имеете в виду? git cleanне перемещает файлы в корзину.
MEMark

0

Если вы не отправили свои изменения (git push), вы также можете вернуть информацию с вашего сервера, которая еще не обновлена. Я использовал filezilla, чтобы вернуть файлы, которые я удалил, и скопировал их в свои локальные файлы. Это не лучший способ, но он работает и позволяет избежать использования консоли.

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