Добавить поврежденный или удаленный коммит на удаленный git-сервер - PullRequest
0 голосов
/ 12 февраля 2019

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

remote: error: Could not read c168e82dd62c0cdbf3ea7c3be3a84218a12c8a03
remote: fatal: Failed to traverse parents of commit 02d8c9217333d89afd61da1788fa82329b692610
remote: aborting due to possible repository corruption on the remote side.
fatal: protocol error: bad pack header

Когда я запускаю git fsck --name-objects:

broken link from  commit 02d8c9217333d89afd61da1788fa82329b692610 (~17)
              to  commit c168e82dd62c0cdbf3ea7c3be3a84218a12c8a03 (~18)

У меня есть локальная копия репо, в которой нет ошибки, есть ли способ просто скопировать отсутствующие или поврежденные файлы?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Поскольку у меня на локальном ПК было обновленное хранилище, я в итоге клонировал хранилище с параметром --bare и обновил сервер этими файлами.

git clone --bare <path to clone from> <path to clone to>
0 голосов
/ 12 февраля 2019

Это не столько файлы , которые отсутствуют или повреждены, это то, что внутренний объект (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 на машине с хорошей копией хранилища.

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

...