Как исправить испорченный репозиторий git - "git fsck" сообщает "предупреждение в дереве [hash]: содержит записи, указывающие на нулевой sha1"

Обзор:

Я не могу успешно перенести изменения в нашем репо на наш производственный сервер.

Запуск "git fsck" в моем репозитории вернул 5 экземпляров той же ошибки:

warning in tree [hash]: contains entries pointing to a null sha1

Ошибка существует во всех версиях нашего репо, включая версию, размещенную на bitbucket.

Мы с моим коллегой внесли изменения в наши локальные версии репо, которые мы очень хотели бы сохранить.

Я пытался выйти на Google, Stackru и Man-страницу, но не могу найти хорошее руководство, которое объясняет, что происходит и как решить проблему.

Мой коллега и я относительные новички, когда дело доходит до GIT. У нас есть основы, но мы еще не потратили время на команды низкого уровня.

Буду признателен за любую помощь в восстановлении целостности моего репо.

Подробное описание:

Мои проблемы начались, когда я попытался вытянуть удаленную ветку на свой рабочий сервер. Это должно было быть простое обновление рабочего каталога, но я получил некоторую расплывчатую ошибку, которую не могу вспомнить, и обнаружил, что мой рабочий каталог поврежден.

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

Запуск "git fsck" в моем репозитории вернул 5 экземпляров той же ошибки:

warning in tree [hash]: contains entries pointing to a null sha1

Я запустил git fsck:

  • мой репо на моей машине разработчика
  • машина разработчика моего коллеги
  • только что клонированная версия репо из bitbucket на dev и prod

Все, что я пробовал, показывает те же предупреждения. Так что, какая бы ни была проблема, она есть во всех версиях нашего репо.

Вызов "git ls-tree [tree hash, сообщающий об ошибке]" показывает нормальную распечатку каталога вместе с неверным хешем дерева:

160000 commit 0000000000000000000000000000000000000000 [name of repo]

Самым близким к решению, которое я нашел, является это сообщение stackru: Как удалить запись с нулевым sha1 в дереве Git. Однако я не смог по-настоящему понять шаги, и команды вырезания и вставки не смогли решить мои проблемы.

Мои вопросы:

  • Что на самом деле означают эти ошибки? Насколько они серьезны?
  • Как мы ремонтируем наше репо (если возможно, пожалуйста, перейдите шаг за шагом к нам, новичкам)?
  • Должны ли мы вносить все изменения в репо до того, как мы его отремонтируем или после?
  • Каковы последствия ремонта репо? Как мы распространяем исправление на все версии репозитория (например, на машины разработчика и производственный сервер)?
  • Что вызывает эту ошибку и как мы можем предотвратить ее повторение?

1 ответ

Этот вопрос очень старый; тем не менее, может быть, это помогает кому-то еще.

  • Эта ошибка, вероятно, означает, что у вас когда-то были подмодули, потом они от них избавились, и что-то пошло не так.
  • Как отремонтировать очень сильно зависит от того, как именно выглядят вовлеченные деревья. Ключ должен был бы понять внутренние механизмы git, чтобы понять, что делать. Это на самом деле не очень сложно, так как в git лежат лишь несколько концепций. Проверьте https://git-scm.com/book/en/v2/Git-Internals-Git-Objects. На вопрос, который вы связали, был дан ответ с очень хорошими указателями.
  • Я бы сделал это так:
    • Сделайте локальную копию вашего репозитория (используя инструменты ОС, а не git), затем выполните git reset --hard в копии, а затем исправить все.
    • Отправьте это исправленное хранилище на новый пульт, чтобы ваш друг мог его забрать.
    • Вы оба копируете свои локальные изменения из своих оригинальных репозиториев, снова с cp не мерзавец
    • Зафиксируйте, нажмите, потяните как обычно, пока эти три новых репозитория не будут в порядке. -Сбросьте свои старые локальные репозитории, замените ваш старый пульт на git push --all --force,
  • Последствия зависят от того, насколько сложным был фактический ремонт. Но это, вероятно, будет сравнимо с огромным перебазированием, т. Е. Новые хеши коммитов повсюду и git, дающие вам сообщение "расходящиеся ветви" с сотнями коммитов между ними. Вы не должны терять историю. Я бы посоветовал не вставлять / вытягивать / объединять старые и новые репозитории.
  • Причиной, вероятно, были некоторые подмодули shenanigans, так как подмодули - это единственное, что заставляет коммит-хэши появляться в деревьях. Чтобы избежать... избежать подмодулей? Тяжело сказать.
Другие вопросы по тегам