Как я могу восстановить репозиторий Git для ошибки "отсутствующего дерева"?

Мы используем Gerrit для нашего репозитория Git. В проекте, который был активен в течение нескольких месяцев, мы неожиданно не можем вносить какие-либо изменения. Когда мы выполняем git push, мы видим следующую ошибку:

error: unpack failed: error Missing tree 14d62f0ed4385e3f68f226ac133fa9932a9c65c9

Выполнение git fsck --full дает:

dangling tree 2701c92fb6eab1826482f6bcc9598413e651a92a  
dangling blob c505b3b12cfacd1e26dec8dc559820a30fc20c27  
dangling blob 8907f94b5b4ec881e1b86d50681795e368c167ff  
dangling blob 4938d9fc34c6e2f92c68872bfec6e070b2b3a9c2  
dangling blob 8a5c8b8d35484ea1470e2d8e6c482fcb97b23d0f  
dangling commit 3072d3314e20bf6c6998e1c02986d83019d3e1df  
dangling tree 5377d7f7111d340854c3ee0946667c202227e603  
dangling tree c3783e9ab540457924ceb9f9fb5ea1c2b97472b1  
dangling blob 8b92d1765038e4ec5e721f98a2aabb305a7f9819  
dangling tree 38a03153f0f18ca15846e9bd4983a86800a43a94  
dangling commit 8db2d6ae5364174bebe13720a359ddb2e62d4c9d  

Все наши разработчики испытывают ту же ошибку, когда они пытаются нажать. До сих пор мы пытались повторно инициализировать gerrit repo (git init --bare...) и подталкивать к нему. Мы также попытались создать новый проект gerrit с отдельным репо. В итоге мы продолжаем получать ту же ошибку.

Есть ли у кого-нибудь представление о том, что будет причиной или как восстановить?

Ответ 1

Используйте git push --no-thin вместо git push.

Из Git docs:

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

Ответ 2

Я получаю такую ​​же ошибку на моей черепахе git. Я, наконец, получил основную причину этой ошибки.

Этапы, вызывающие эту ошибку,

  • Создайте новую ветку на голове.
  • Сделайте некоторые изменения в новых ветвях
  • Кто-то также вносит изменения в головную ветвь
  • Попробуйте нажать свою ветку

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

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

Ответ 3

Резервное копирование... сделайте это прямо сейчас, прежде чем попробовать что-нибудь.

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

find . -name d62f0ed4385e3f68f226ac133fa9932a9c65c9

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

find . -name \*.idx -exec cat {} \; | git show-index | grep 14d62f0ed4385e3f68f226ac133fa9932a9c65c9

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

git unpack-objects $FILE

Оттуда скопируйте файл на тот же относительный путь на вашем сервере. Если это не решит его, необходима дальнейшая работа. Обмен файлами с обновленным хранилищем для разработчиков может исправить ситуацию. Вы также можете изучить https://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F или опубликовать комментарии к обновлению и дождаться, когда я вернусь к этому.

Ответ 4

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

git gc --aggressive --prune=now

сначала создайте резервную копию git!

Ответ 5

Попробуйте git pull --rebase.

Я сохранил diff (git show > ~/mychanges.txt, достал сообщение commit в верхней части файла). Выбранная новая ветка (git checkout -b newbranch) применила изменения (git apply ~/mychanges.txt), а затем сделала git pull --rebase. Затем все сработало.

Ответ 6

Если не на главной ветке, вы можете просто удалить удаленную ветку с помощью:

git push --delete origin <branch_name>

И затем верните ветку назад на пульт:

git push -u origin <branch_name>

Ответ 7

У меня такая же проблема. Чтобы решить эту проблему, я использовал git fetch, после чего снова нажал, и все получилось просто отлично.

Ответ 8

Попробуйте обновить версию git, мы увидели проблемы с 1.9.0

Ответ 9

Это обычно происходит, когда время фиксации и нажатия отличается и в конечном итоге создает несоответствие между обоими деревьями. Учитывая удаленную ветвь вверх по течению и локальную ветвь foo

Сначала отбросьте все незафиксированные изменения, используя

git reset --hard foo

Затем отследите удаленную ветку с помощью

git branch --set-upstream-to=upstream/foo

И наконец

git pull

Ответ 10

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

Ответ 11

Быстрое решение Fetch → Rebase- > Зафиксируйте, а затем нажмите.

Ответ 12

Я удалил свою главную ветку и создал еще раз. Работает. git branch -D master, мастер git checkout К счастью, это работает

Ответ 13

В моем случае оказалось, что я забыл git fetch перед git rebase -i origin/master. Таким образом, когда я попытался нажать на Gerrit, я получил вышеуказанную ошибку.