Что произойдет, если я прерву команду git add?
Я выполнил следующую команду:
git add .
Поскольку файлов много (> 10 ТБ), добавление заняло много времени. На полпути я случайно удалил некоторые файлы (которые мне нужно восстановить). Итак, я, если я делаю "Ctrl + C" в терминале (прерывая Git).
Что просходит?
- Будет частичное добавление в git (и я могу восстановить некоторые файлы, используя git checkout?)
- Там не будет никаких файлов, добавленных в Git.
Спасибо,
1 ответ
В моих экспериментах прервано git add
ничего не оставляет в индексе (вы можете подтвердить это с помощью git status
), но он сохраняет все созданные им двоичные объекты во внутренних структурах, поэтому могут быть некоторые файлы, которые можно восстановить. Посмотрите на https://git-scm.com/book/en/v2/Git-Internals-Git-Objects информацию о том, как извлечь файлы из внутренних блотов Git.
Я восстановил один файл следующим образом:
> find .git/objects -type f
...
.git/objects/ac/a6e96aaf9492a2ee8f9ef51f0197ad56436fd4
...
> git cat-file -p aca6e96aaf9492a2ee8f9ef51f0197ad56436fd4 > file1
Обратите внимание, что идентификатор блока является именем каталога ac
плюс имя файла BLOB-объекта a6e96...
делать aca6e96...
,
Таким образом, Git дал мне содержимое одного файла. Это не будет весело использовать, потому что вы получаете содержимое файла без имени файла. К сожалению, имя файла было бы сохранено в индексе и в более надежных структурах, если бы у вас была возможность выполнить фиксацию, но эта информация еще не будет доступна для больших двоичных объектов, созданных во время прерванного git add
,
Вот скрипт, который перечислит все ваши большие двоичные объекты в одном файле с разделителями, что может немного облегчить вашу жизнь:
файл list-blobs.pl
:
#!/usr/bin/perl
open BLOBS, "find .git/objects -type f |";
while (<BLOBS>) {
chop;
s#.*(..)/#\1#;
print "BLOB $_\n";
system("git cat-file -p $_");
}
Бежать
chmod +x list-blobs.pl
list-blobs.pl | less
и вы увидите, какие объекты Git на самом деле хранит в BLOB-объектах, прежде чем прервать git add
,
Проще еще: используйте https://github.com/ethomson/git-recover предоставленный его автором Эдвардом Томсоном в комментариях ниже.