Как я могу восстановить свой 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 (git init --bare ...) и подталкивать к нему. Мы также попытались создать новый проект Gerrit с отдельным репо. В конце концов, мы продолжаем получать ту же ошибку.
Есть ли у кого-нибудь понимание того, что будет причиной, или как восстановить?
11 ответов
Использование git push --no-thin
вместо git push
,
Из Git Docs:
Тонкая передача значительно уменьшает объем отправляемых данных, когда отправитель и получатель совместно используют много общих объектов. По умолчанию используется --thin.
Я получаю эту же ошибку на моем tortiuse git. Я наконец получил основную причину этой ошибки.
Шаги, которые вызывают эту ошибку;
- Создайте новую ветку на голове.
- Сделайте некоторые изменения на новых ветках
- Кто-нибудь также вносит изменения в головной филиал
- Попробуй подтолкнуть свою ветку
Эта ошибка произойдет, если будет создана локальная ветвь, а не выдвинута до тех пор, пока в головную ветвь не будут внесены некоторые изменения. Это нормальное явление, так как удаленная головная ветвь ничего не знает о вашей локальной ветке до принудительного действия.
Чтобы устранить эту ошибку, переключите головную ветвь, чтобы получить полное тяговое действие. Затем переключите свою ветку и попробуйте нажать.
У меня такая же проблема. Чтобы решить эту проблему, я использовал git fetch, затем снова нажал, и все заработало нормально.
Сделайте резервную копию... сделайте это прямо сейчас, прежде чем пытаться что-либо сделать.
Теперь это звучит неудачно. Обидно также, что не похоже, что у вас есть регулярная резервная копия, к которой можно обратиться. Однако есть и хорошие новости: держу пари, что у ваших разработчиков есть этот файл, хотя он может быть в файле пакета. Попробуйте следующее в чужом каталоге.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 или опубликовать комментарии об обновлениях и подождать, пока я вернусь к этому.
Когда мы получаем это, я почти всегда могу исправить это с помощью git gc:
git gc --aggressive --prune=now
сначала сделайте резервную копию вашего git-репо!
Попробуйте git pull --rebase
,
Я сохранил разницу (git show > ~/mychanges.txt
, вынул сообщение в верхней части файла). Проверил новую ветку (git checkout -b newbranch
) применил изменения (git apply ~/mychanges.txt
), а затем сделал git pull --rebase
, Тогда все заработало.
Если нет главной ветки, вы можете просто удалить удаленную ветку:
git push --delete origin <branch_name>
А затем перенесите свою ветку обратно на пульт:
git push -u origin <branch_name>
Попробуй сначала сделать
git gc
тогда делай
git push
Есть такая же проблема. выше решение сработало для меня.
Странно, --no-thin
аргумент не сработал для меня. То, что сработало, былоgit pull
(так что наверное git fetch
.
Обычно это происходит, когда время фиксации и нажатия отличается и что в конечном итоге создает несоответствие между двумя деревьями. Учитывая удаленную ветку upstream и локальную ветку foo
Сначала отбросьте все незафиксированные изменения, используя
git reset --hard foo
Затем отследите удаленную ветку, используя
git branch --set-upstream-to=upstream/foo
И наконец
git pull
Попробуйте обновить вашу версию git, мы увидели проблемы с 1.9.0
В моем случае оказалось, что я забыл выполнить git fetch перед git rebase -i origin/master. Таким образом, когда я попытался нажать на геррит, я получил указанную выше ошибку.
Я удалил свою главную ветку и создал еще раз. Работает. git branch -D master, git checkout master К счастью, это работает
Технически этот ответ немного запоздал, но для меня сработало создание патча для набора изменений, который я пытался перенести, перенести репозиторий в другое место на диске, применить патч, повторить и отправить.