Это не столько файлы , которые отсутствуют или повреждены, это то, что внутренний объект (commit 02d8c9217333d89afd61da1788fa82329b692610
на сервере) ссылается на другой внутренний объект (c168e82dd62c0cdbf3ea7c3be3a84218a12c8a03
), который отсутствует.Хотя некоторые объекты хранятся в отдельных файлах, другие упакованы : тысячи объектов в одном файле.
Если у вас есть объект c168e82dd62c0cdbf3ea7c3be3a84218a12c8a03
, вы можете извлечь его из собственного репозитория, отправивзакончите и вставьте в другой репозиторий.Однако обычно это гораздо сложнее, чем просто клонировать репозиторий good (при условии, что у него есть все - не каждый клон будет завершен, например, он может быть устаревшим или --single-branch
клон).
Чтобы извлечь один объект, сначала найдите его тип:
git cat-file -t c168e82dd62c0cdbf3ea7c3be3a84218a12c8a03
Затем извлеките его необработанные данные:
git cat-file -p c168e82dd62c0cdbf3ea7c3be3a84218a12c8a03 > /tmp/obj.data
Скопируйте данные объектаи вставьте его в хранилище:
scp /tmp/obj.data serverhost:/tmp/obj.data
ssh serverhost
cd ...
git hash-object -w -t $type /tmp/obj.data
, где $type
- это тип с git cat-file -t
на машине с хорошей копией хранилища.
(Добавление отсутствующего объектаможет все исправить или может просто выявить больше проблем, что является еще одной причиной, по которой часто предпочтительнее просто полностью заменить плохой репозиторий другим клоном.)