Что произойдет, если я прерву команду git add?

Я выполнил следующую команду:

git add .Поскольку файлов много (> 10 ТБ), добавление заняло много времени. На полпути я случайно удалил некоторые файлы (которые мне нужно восстановить). Итак, я, если я делаю "Ctrl + C" в терминале (прерывая Git).

Что просходит?

  1. Будет частичное добавление в git (и я могу восстановить некоторые файлы, используя git checkout?)
  2. Там не будет никаких файлов, добавленных в 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 предоставленный его автором Эдвардом Томсоном в комментариях ниже.

Другие вопросы по тегам