Могу ли я вернуть файлы в рабочем дереве, которые исчезли в результате запуска git restore -s@ -SW?

Я забыл добавить .ai в свой файл .gitignore, но запустил $ git add . и добавил в индекс несколько файлов .ai.

Когда я запустил $ git status и увидел их, мне захотелось удалить их из индекса.

В спешке я запустил $ git restore -s@ -SW, в результате чего все мои .ai файлы исчезли из моего рабочего дерева. Я не должен был использовать W.

Есть ли способ вернуть мои файлы .ai?


person Sherman Chen    schedule 09.07.2021    source источник
comment
Если вы их никогда не совершали и у вас нет резервной копии, то, извините, нет.   -  person Inigo    schedule 09.07.2021
comment
@Inigo Если они добавили это в индекс, они находятся в папке объектов. Если они никогда не были зафиксированы, они все еще существуют как подвешенные объекты.   -  person Lasse V. Karlsen    schedule 09.07.2021
comment
@LasseV.Karlsen Я всегда предполагал, что объекты создаются только при фиксации (внутренние тайники похожи на фиксацию). Но если подумать, то, что вы говорите, имеет смысл (как иначе git отслеживает записи индекса?) Так что я только что кое-что узнал. Спасибо! Голосование за ответ VonC :)   -  person Inigo    schedule 09.07.2021
comment
Что такое -ДВ? Я сомневаюсь, что ты когда-либо говорил это. Может быть, вы сказали -SW.   -  person matt    schedule 09.07.2021
comment
Прости. Ты прав. я сделал -СВ   -  person Sherman Chen    schedule 09.07.2021
comment
@Inigo git add добавляет объекты в базу данных объектов. Индекс - это индекс, идентификаторы объектов для интересных путей.   -  person jthill    schedule 10.07.2021


Ответы (1)


Во-первых, проверьте, есть ли у вас доступ к этим файлам через локальную историю (записанную вашей IDE, а не Git)

Например, расширение VSCode для локальной истории, как предложено здесь, может помочь.

Если нет, дважды проверьте функцию резервного копирования вашей ОС, например, для MacOS Статус Time Machine на случай, если вы сможете восстановить их из резервной копии.

Наконец, поскольку вы добавили эти файлы в индекс, проверьте git fsck

git fsck --cache --no-reflogs --lost-found --unreachable HEAD

Из перечисленных SHA1 вы можете выполнить git show:

git show "<SHA-1 REFERENCE TO THE BLOB OBJECT HERE>" > lost_file.txt

Как отметил torek в комментарии:

Обратите внимание, что вы также можете найти содержимое каждого из этих недоступных больших двоичных объектов в каталоге .git/lost-found/other.

Часто это быстрее и проще, чем git show, так как вы можете cd .git/lost-found/other, а затем grep expected-string * найти файл(ы), содержащие ожидаемую строку.

person VonC    schedule 09.07.2021
comment
Большое спасибо за ответ, VonC! Я использую vim и не использовал IDE. Я не настраивал резервное копирование в своей Windows 10. Я выполнил рекомендованную вами команду git fsck и получил следующий результат. Что я могу сделать дальше, пожалуйста? - person Sherman Chen; 09.07.2021
comment
@ShermanChen Нет проблем: вам удалось восстановить эти файлы? - person VonC; 09.07.2021
comment
$ git fsck --cache --no-reflogs --lost-found --unreachable HEAD Проверка каталогов объектов: 100% (256/256), выполнено. недостижим блоб 0ec003e3d01171ac5e34fa1004b35f8ec75ca598 недостижим совершить 71517cfc137a01064a260786891d0b30c8e3e639 недостижим блоб ea822e0644c310f5217c0adf5bb2aa56f4ad320d недостижимый блоб 86136a72fe190dc1b38f28e83feb83e6433f5b19 недостижим блоб 4344ae85545d6f772c50f0a9706dcd2c31d33027 недостижим блоб db650a29ec44871ded5972249c6b921de9460bda недостижим блоб f9b55969b1d8665184a1de04d1de98e4e43e6230 недостижим блоб 7f5679c6af24e68cb2f5ba609129fb7b954b8856 - person Sherman Chen; 09.07.2021
comment
@ShermanChen См. stackoverflow.com/a/63435475/6309 для восстановления файлов. - person VonC; 09.07.2021
comment
О Боже! Я вернул один из потерянных файлов. Это чудо! Огромное спасибо за помощь, VonC!!! Команда «показать» сделала намного больше, чем просто «показать»! Он сильно восстановился после неправильного «восстановления»! Я не ожидал, что эти файлы могут быть найдены обратно. Я разместил свой вопрос, возможно, немного надежды. Как я могу купить тебе хотя бы кофе, VonC? - person Sherman Chen; 09.07.2021
comment
@ShermanChen Отличная работа! Я отредактировал ответ, добавив git show - person VonC; 09.07.2021
comment
VonC, Ваш отличный ответ поможет бесчисленному количеству людей! - person Sherman Chen; 09.07.2021
comment
@ShermanChen Это действительно цель. Не забудьте прочитать stackoverflow.com/help/someone-answers. - person VonC; 09.07.2021
comment
@ShermanChen: обратите внимание, что вы также можете найти содержимое каждого из этих недоступных больших двоичных объектов в каталоге .git/lost-found/other; это часто быстрее и проще, чем git show, поскольку вы можете cd .git/lost-found/other, а затем grep expected-string * найти файл(ы), содержащие ожидаемую строку. - person torek; 09.07.2021
comment
@torek Спасибо за этот вариант. Я включил ваш комментарий в ответ для большей наглядности. - person VonC; 09.07.2021
comment
@torek нет каталога .git/lost-found/. - person Sherman Chen; 10.07.2021
comment
@ShermanChen: с git fsck --lost-found Git должен создать его и заполнить. Возможно, --unreachable отключил это, но я не думаю, что это нужно. - person torek; 10.07.2021
comment
@torek О. Не знаю почему, но нет. - person Sherman Chen; 10.07.2021
comment
@ShermanChen Какую версию Git вы используете? И на какой ОС (название и версия)? - person VonC; 10.07.2021
comment
@VonC git версия 2.31.1 Windows10 Pro версия 21H1 - person Sherman Chen; 10.07.2021
comment
@VonC @torek Я только что установил git версии 2.32.0.windows.2 и снова запустил git fsck --cache --no-reflogs --lost-found --unreachable HEAD. До сих пор нет .git/lost-found/ - person Sherman Chen; 10.07.2021
comment
@torek Я понимаю, что это --lost-found подразумевает --no-reflogs (и попытка обновления документации не получается), но я попробовал git add aFile, rm aFile, git restore -s@ -SW (статус чистый), и git fsck --cache --lost-found --unreachable HEAD, и. .. lost-found папка нигде не найти, ээээ. - person VonC; 10.07.2021
comment
Любопытный. Возможно, это новая ошибка в git fsck; На самом деле я сам несколько раз использовал всю эту потерянную + найденную вещь в далеком прошлом. - person torek; 10.07.2021