Github Repo Corruption - Sha1 Collision - PullRequest
       7

Github Repo Corruption - Sha1 Collision

24 голосов
/ 01 февраля 2011

Вчера одна из проверок моей команды испортила наше репозиторий на github. На github они показывали эту ошибку:

$ git fsck
error: sha1 mismatch 87859f196ec9266badac7b2b03e3397e398cdb18

error: 87859f196ec9266badac7b2b03e3397e398cdb18: object corrupt or missing
missing blob 87859f196ec9266badac7b2b03e3397e398cdb18

Когда я пытался вытащить на другую машину, я получил это:

Hyperion:Convoy-clone saalon$ git fsck
warning in tree 5b7ff7b4ac7039c56e04fc91d0bf1ce5f6b80a67: contains zero-padded file modes
warning in tree 5db54a0cdcd5775c09365c19c061aff729579209: contains zero-padded file modes
broken link from    tree 6697c12387f8909cfe7250e9d5854fd6713d25c1
              to    blob 87859f196ec9266badac7b2b03e3397e398cdb18
dangling tree 144becf61ae14cec34b6af1bd8a0cf4f00d346d1
missing blob 87859f196ec9266badac7b2b03e3397e398cdb18

(я получаю предупреждения о файлах с нулевым заполнением как на компьютере-нарушителе, так и на втором компьютере, к которому я обратился. Я получаю ошибку неработающей ссылки только на втором компьютере).

Я отследил этот BLOB-файл до конкретного файла, в котором возникла проблема, но после прохождения процесса Git FAQ по исправлению ошибки неработающей ссылки мне не повезло.

Я просмотрел документацию Github и обнаружил процесс удаления главного репозитория из github и повторной загрузки с компьютера-нарушителя. Я попробовал это, но когда я снова нажал на ветку master, я получил следующую ошибку:

fatal: SHA1 COLLISION FOUND WITH 87859f196ec9266badac7b2b03e3397e398cdb18 !
error: unpack failed: index-pack abnormal exit

У меня есть открытый билет с Github, но он всегда отвечает им. Есть идеи, в чем может быть проблема? Есть ли проблема в Github, которую они должны исправить, или я могу что-то сделать, чтобы позаботиться об этом?

Ответы [ 4 ]

22 голосов
/ 02 февраля 2011

После некоторого перерыва с GitHub (и некоторой справки по устранению неполадок от ssmir) эта проблема разделена между тем, что мне нужно было решить, и тем, что нужно решить Github.

Что нужно было решить с моей стороны, так это:

Hyperion:Convoy-clone saalon$ git fsck
warning in tree 5b7ff7b4ac7039c56e04fc91d0bf1ce5f6b80a67: contains zero-padded file modes
warning in tree 5db54a0cdcd5775c09365c19c061aff729579209: contains zero-padded file modes
broken link from    tree 6697c12387f8909cfe7250e9d5854fd6713d25c1
              to    blob 87859f196ec9266badac7b2b03e3397e398cdb18
dangling tree 144becf61ae14cec34b6af1bd8a0cf4f00d346d1
missing blob 87859f196ec9266badac7b2b03e3397e398cdb18

Если вы заметили, существует неработающая связь дерева с блобом. Это говорит о том, что есть папка, в которой должен быть файл, но на самом деле в ней нет файла. Кто-то добавил файл в локальное хранилище и выдвинул его, но сам файл не попал в удаленное хранилище. Теперь каждый раз, когда кто-то самостоятельно закрывает репозиторий, он получает одну и ту же битую ссылку на файловую систему git.

Инструкции здесь хорошо объясняют, что делать, если у вас возникла проблема, но в разгар реального кризиса я обнаружил, что описание немного не хватает контекста. Он дал четкий список шагов, но не очень хорошо представлял причину - по крайней мере, не для того, кто еще немного новичок в Git.

По сути, вам нужно выяснить, что это за файл, отсутствующий большой двоичный объект, отследить, какой компьютер проверял его в последний раз, и приступить к работе с локальным репозиторием. Их компьютер имеет как ссылку SHA1 на файл , так и содержимое самого файла. У всех остальных куча сломанных.

Итак, во-первых, нам нужно выяснить, какие капли / файлы находятся в этом дереве. Для этого вы используете git ls-tree.

git ls-tree 6697c12387f8909cfe7250e9d5854fd6713d25c1

В моем случае это был только один файл: файл, который был поврежден. В вашем случае это может привести к полному списку файлов, и в этом случае вам нужно сопоставить SHA1-хэш блоба / файла с тем, который указан в ошибке неработающей ссылки. В моем случае это было так:

100644 blob 87859f196ec9266badac7b2b03e3397e398cdb18    short_description.html

Обратите внимание, что он не дает вам каталог, в котором файл должен находиться. Это немного расстраивает, но с небольшой детективной работой вы можете его найти. Файл может иметь уникальное имя, и в этом случае вы можете просто найти имя файла. Или вы можете просмотреть свою историю коммитов и посмотреть, когда и где был размещен файл с именем short_description.html.

Вот та часть, в которой GitFaq был не совсем понятен. Они говорят, чтобы восстановить файл, а затем выполнить эту команду:

git hash-object -w db/content/page_parts/venues/86/short_description.html 

Но что это делает?

Обычно, когда вы запускаете git hash-object возвращает хэш sha1 для этого файла. И (и вот важная часть) он создает блоб из файла, а блоб был тем, чего нам не хватало. Вот часть, над которой неясно, однако: для того, чтобы это работало, файл должен точно соответствовать файлу, который изначально вызвал проблему. Другими словами, если в этом файле short_description.html есть содержимое, вы не можете просто создать пустой файл и запустить hash-объект. Если вы это сделаете, хэш блоба sha1 не будет соответствовать отсутствующему git, и эта битая ссылка все равно будет сломана.

Вот почему вы должны быть в репо нарушителя. У всех есть ссылка, но нет файла и блоба. У компьютера-нарушителя (надеюсь) все еще есть оригинальный файл. В моем случае у них не было исходного файла (в моем случае, он был случайно удален), но когда я посмотрел на историю их коммитов на их коробке, diff содержал содержимое файла, который был зафиксирован, но никогда сделал это на github. Я скопировал это, пересоздал файл и запустил hash-объект. В следующий раз, когда я запустил git fsck, битая ссылка исчезла.

Одно примечание: технически эта проблема может быть исправлена ​​в чьем-либо репо, при условии, что вы можете восстановить отсутствующий файл. В моем случае я действительно создал файл на компьютере-нарушителе, но отправил его мне по электронной почте и устранил проблему в чистом хранилище в другой системе. Важно точно воссоздать файл, чтобы он генерировал тот же хэш sha1, который отсутствует в репо.

Что касается проблемы столкновения SHA1, которую я получил, когда пытался нажать на github? Это уродливая присоска?

fatal: SHA1 COLLISION FOUND WITH 87859f196ec9266badac7b2b03e3397e398cdb18 !
error: unpack failed: index-pack abnormal exit

Это была проблема на стороне github, которую они должны были исправить.

8 голосов
/ 29 августа 2012

Просто напоминание.Небольшая вероятность того, что что-то случится, не то же самое, что и невозможность случиться.Вы можете получить хеш-коллизии с использованием мерзавца sha-1.Как только у вас есть два файла, которые сталкиваются, вероятность становится 100%.На данный момент, есть небольшое утешение от теоретической вероятности.Добавьте пробел к одному, и все будет хорошо.

5 голосов
/ 06 февраля 2015

Я столкнулся с той же проблемой и побежал:

git prune  
git gc  

который упомянул

ошибка: неверный реф для refs / remotes / origin / ticketName

поэтому я удалил ссылку, и это устранило проблему:

rm .git/refs/remotes/origin/ticketName
0 голосов
/ 19 сентября 2018

Это недавно произошло со мной на "git pull" с сервера AWS Git.Команды ниже решают проблему.спасибо

git prune git gc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...