Чи можу я відновити видалені файли (скасувати `git clean -fdx`)?


119

Я дотримувався вказівки щодо створення сторінок github і забув перейти в свій підкаталог git. Як результат, я просто занурив цілий каталог документів git clean -fdx.
Чи є якийсь спосіб я скасувати цю страшну помилку?


2
Я точно не знаю, але не думаю, що це можливо з git. Однак неповторна утиліта для вашої файлової системи може зробити свою справу.
static_rtti

9
Цікаво, що Git Community Book також git clean -fdxбез жодного попередження говорить про те, що операція настільки небезпечна. Цікаво, скільки людей безповоротно знищили свої файли цією, здавалося б, невинною пропозицією.
капноз

5
Не забудьте перевірити, чи є у вашої IDE "локальна історія", як Eclipse або IntelEJ IDE. Це може заощадити багато душевного болю від ненавмисних git cleanдзвінків. Також спробуйте вийти з звички прибирати, не перевіряючи. Створіть сценарій Powershell або Bash, який можна викликати, який запуститься git clean -fdxnз підказкою підтвердження, перш ніж ви дійсно запустите неймовірно руйнівну чистку.
Джош Берджесс

Відповіді:


129

Ні. Ці файли більше немає.

(Щойно перевірено на Linux: git clean callunlink() , і не створює резервного копіювання нічого заздалегідь.)


32
Якщо ви використовуєте розширений IDE, такий як RubyMine, Eclipse тощо, швидше за все, це буде локальна історія видалених файлів, і ви зможете їх відновити.
Усман

1
@Usman у моєму випадку git cleanвипадково видалив відкладені зміни всередині .ideaприхованої папки, і локальна історія врятувала мене!
emkman

2
Чудова порада від @Usman. За допомогою Eclipse я міг би повернути свій файл із опцією "Відновити з локальної історії ...": i.imgur.com/XWNLOk5.gifv
brandizzi

1
Насправді це МОЖЛИВО, але методом хакі. Дивіться цю відповідь: stackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/…
Тінь Тінь

4
У PyCharm ви також можете їх відновити. Клацніть правою кнопкою миші в папці, яка їх мала, клацніть в локальній історії, знайдіть видалення та натисніть кнопку відновити.
Хуанхо Конті

48
git clean -fdxn

Зробить сухий пробіг і покаже, які файли буде видалено, якщо ви запустили

git clean -fdx

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


7
Щоб додати до цього, -nпрацює над більшістю команд git (та багатьох інших * nix-команд).
Нік МакКерді


18

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

Якщо ви зробили 'git add' на одному з цих файлів порівняно недавно (але скасували комісію), є ймовірність, що ви знайдете його за допомогою 'git fsck --lost-found'. Варто спробувати, але не варто надто сподіватися на сподівання.

Надалі вам слід розглянути можливість скоєння кількох разів занадто часто, ніж кілька разів надто рідко. Таким чином, у вас буде принаймні локальна резервна копія, навіть якщо ви не в кінцевому підсумку переміщуєте ці зобов’язання на віддалений.


Справжня проблема полягала в тому, що каталог також не повинен був бути сховищем. Озирнувшись до журналу, виявляється, я забув записати компакт-диск у новий каталог репо після 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

Якщо ви використовуєте будь-який ID Jetbrains IDE, є можливість переглянути локальну історію файлу. У випадку, якщо ви це зробилиgit clean , ви можете відтворити файл і перевірити локальну історію файлу та відновити його звідти.

Для мене працював один файл. Для повного каталогу я не маю уявлення, як це зробити.


Створіть файл у тому самому місці з тим самим ім'ям файлу. У IDE клацніть правою кнопкою миші та натисніть «Показати історію». Скопіюйте з нього вміст. Відмінна порада @Rajesh. Дякую.
глибокий

1
Я врятований. Дякую.
Скотт,

Не потрібно копіювати вміст файлу, просто клацніть правою кнопкою миші файл та натисніть "повернути", щоб відновити його до цієї версії (навіть якщо ви її видалили)
n00b

7

У мене сьогодні була ця проблема.

Як говорили інші, git не зберігає файли.

Єдиний спосіб скасувати це за допомогою виправленої утиліти. Я використав "extundelete" і відновив все, але ваш пробіг / файлова система може відрізнятися.


7

Якщо ви працюєте над Eclipse, одним із можливих рішень є відновлення з локальної історії Eclipse.


2
я, використовуючи PyCharm, і краєзнавство врятувало мене
psychok7

1
Те саме в IntelliJ IDEA!
Артуракай

У RubyMine також є краєзнавство. врятував мене!
Усман

Усі браузери IntelliJ мають локальну історію. Вдячно Я використовував WebStorm і майже перед цим виявив аневризму. Пройшло 3 дні, що варті 12 годин робочих днів, і я серйозно подумав про те, щоб занести пляшку міцного спиртного за моїм столом.
Джош Берджесс

7

Насправді так ! Це можливо! Але без використання git-команд.
Все, що нам потрібно, це лише інструмент відновлення файлів, як Recuva .
Просто згадайте шлях, з якого він був видалений, і нехай він відновить файли.

Також ось кілька корисних зауважень щодо використання цього додатка:

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

Увага! Як тільки ви втратите (випадково видалите) будь-який файл, намагайтеся не торкатися (додавати / редагувати файли) диска, з якого він був видалений, щоб збільшити можливість успішного відновлення. Інакше ви можете повністю втратити цей файл.

Чому це працює: Коли ви видаляєте файл, насправді він не видаляється. Він просто позначений як "видалений", тому наступного разу, коли ви додаєте / оновлюєте файли на той же диск, ці старі файли перезаписуються новими. Але поки вони не будуть перезаписані, все одно можна прочитати (і, звичайно, відновити) файли.


1
Дякую, що ти врятував мені життя. Я не знаю, чи це правильна відповідь, тому що я не міг відновити все, але мені пощастило, оскільки я отримав найважливіші файли, які мені потрібні.
XzaR

2

Я зробив з кодом, який я повинен був додати до свого сховища, і я очистив за допомогою -dfx я міг відновити файли.

Я намагався використовувати налагодження, шукати та посилатись з inodes, testdisk та багато інших інструментів, що з’являються, і жоден не знайшов каталог, який цей дурний текст випадково видалив.

Завантажте extundelete з sourceforge.
Можливо, вам буде потрібно встановити пакет e2fslibs-dev
Run

$ ./configure 
$ make 

Він створить двійковий файл для extundelete всередині папки src. У моєму випадку я неправильно видалив папку. давайте назвемо його FOOBAR

Я щойно бігав:

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


і він створив папку з назвою RESTORED_FOLDERS


Оце Так! Хоча цей файл не відновив потрібний мені файл, я це зауважу - обов'язково стане в нагоді!
вьом

1

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


1

Якщо ви використовуєте mac та створили резервну копію з a Time Machine, то можете відновити


0

На щастя, я допустив цю помилку під час використання Windows 7. Пішов переробляти кошик, виділив усі видалені файли та натиснув "Відновити". Зроблено.


5
Що ви маєте на увазі? git cleanне переміщує файли до кошика.
ПАМ'ЯТ

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.