Исправить Git "объект не найден" навсегда

От одного рывка к другому каждый git pull на сервере заканчивается этим:

$ git pull
remote: Counting objects: 53, done.
remote: Compressing objects: 100% (32/32), done.
remote: Total 32 (delta 19), reused 0 (delta 0)
Unpacking objects: 100% (32/32), done.
error: unable to find 71682baccff823caa21420b16dd231c6b9c1b133
fatal: object 71682baccff823caa21420b16dd231c6b9c1b133 not found

То же самое с git fetch, Я мог бы решить это за одно нажатие, скопировав файл .git/object/71/682baccff823caa21420b16dd231c6b9c1b133 на сервер, но после еще нескольких попыток ошибка все еще оставалась, каждый раз с новым объектом фиксации в ветви.

Как это может случиться? И как я могу это исправить навсегда?

Полный git clone не является хорошим решением, так как этот репозиторий находится на работающем серверном проекте и имеет больше файлов без контроля git.

Это возможно clone в новый каталог, а затем скопируйте .git каталог в старую папку? Или есть другое решение, не касаясь каталогов?

3 ответа

Решение

Я мог бы решить проблему путем

  1. Попробуйте получить (с ошибкой)
  2. Скопируйте объектный файл как выше
  3. git merge с фиксацией отсутствующего объектного файла.

Теперь это кажется решенным, ошибка не появляется снова.

Я работаю в команде разработчиков с поврежденным git-репозиторием, так как мы еще не успели это исправить. Я обнаружил, что некоторые вещи поддерживают движение мяча, что может помочь.

Во-первых, иметь одну машину с [gc] auto=0 и распаковать весь репозиторий на объекты

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

В-третьих, всегда нужно делать git fetch с машины 1.8, а затем git pull с машины 1.7

В-четвертых, когда даже 1.8 не может выполнить git pull, вам нужно запустить git fsck |grep missing и вручную скопировать объекты из распакованного репо в хранилище объектов на поврежденном репозитории (где отсутствующий 0c0ef24... будет в объектах /0c/0ef24...)

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

Что было бы действительно удобно, так это команда git, чтобы получить конкретный объект из источника, но я думаю, было бы еще лучше, если бы он делал это без необходимости спрашивать:-)

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

Я столкнулся с этой проблемой сегодня, пытаясь git pull из коробки centos 6 с git 1.7.1. Проблема была решена после того, как я обновил git-клиент до версии 1.7.11 из rpmforge-extras.

Другие вопросы по тегам