Как я могу восстановить свой Git-репозиторий при ошибке «отсутствует дерево»? - PullRequest
28 голосов
/ 30 августа 2011

Мы используем 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 (git init --bare ...) и подталкивать к нему. Мы также попытались создать новый проект Gerrit с отдельным репо. В итоге мы продолжаем получать ту же ошибку.

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

Ответы [ 13 ]

39 голосов
/ 23 сентября 2015

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

Из Git Docs:

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

15 голосов
/ 08 июля 2015

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

Действия, которые вызывают эту ошибку;

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

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

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

8 голосов
/ 30 августа 2011

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

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

find . -name d62f0ed4385e3f68f226ac133fa9932a9c65c9

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

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, или опубликовать комментарии об обновлении и подождать, пока я вернусь к этому.

7 голосов
/ 29 июня 2017

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

git gc --aggressive --prune=now

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

4 голосов
/ 22 мая 2013

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

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

3 голосов
/ 01 марта 2015

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

2 голосов
/ 28 июня 2018

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

1 голос
/ 08 декабря 2017

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

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

git reset --hard foo

Затем отслеживайте удаленную ветку, используя

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

И наконец

git pull
1 голос
/ 26 ноября 2015

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

0 голосов
/ 17 июля 2019

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

...