Могу ли я восстановить удаленные файлы (отменить 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». Стоит попробовать, но не надейтесь слишком.

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

kusma
источник
Настоящая проблема заключалась в том, что каталог также не должен был быть репозиторием. Оглядываясь назад на журнал, оказывается, что я забыл записать 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/

Pawel
источник
1

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

Nullable
источник
0

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

Мэтт Кэшатт
источник
6
Что вы имеете в виду? git cleanне перемещает файлы в корзину.
MEMark
0

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

Мботет
источник