Git - как восстановить из пропавшего blob

Я запускаю git 1.6.4.2. Уборка мусора не позволяет сказать "ошибка: не удалось найти <SHA1>".

Мне удалось определить, что недостающий объект - это blob, и я не могу вернуть файл blob. Кажется, что два скрипта, которые запускают "git add" и "git commit", запускались одновременно и им мешали друг другу, так что один передавал более новую версию файла, чем другую, и более старые версия blob исчезла.

Итак, что я пытаюсь сделать сейчас, это откат моего репозитория, чтобы вынуть фиксацию, которая относится к дереву, которое относится к отсутствующему блоблю.

Я знаю, какая ветвь была включена, поэтому я запустил "git reset" для перемотки назад к родительскому члену команды duff. И я знаю, что ветка была объединена где-то в другом месте, поэтому я перематываю эту ветку. Насколько я знаю, на duff commit/tree/blob ни на что не ссылаются. Но если я запустил git prune --expire =, а затем git gc, то я все равно получаю сообщение об ошибке с отсутствующим объектом.

Итак, мой вопрос заключается в следующем: как я могу запросить базу данных git, чтобы найти каждый объект дерева, содержащий идентификатор duff blob? И как мне узнать, что вызывает git чернослив, чтобы сохранить его?

Tricky!!

Спасибо Кевин

Ответ 1

После немного более рыхления выясняется, что на мой вопрос ответили: Как удалить blob из git repo - git prune не было обрезкой материал, который я ранил, потому что reflog все еще ссылался на него. Запуск

git reflog expire --expire=now --all

исправлено это. Кроме того, ссылочная позиция предоставляет механизм для запуска git lstree для каждой фиксации для поиска ссылочного блоба.

Ответ 2

У меня была та же проблема (отсутствует blob) и решение с

git reflog expire --expire=now --all

не сделал трюка. Я нашел свое решение здесь: https://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F

Эта простая строка

git hash-object -w <file>

Исправлено недостающее blob.

Надеюсь, что это поможет.