Git: "коррумпированный свободный объект"



всякий раз, когда я тяну от моего пульта дистанционного управления, я получаю следующую ошибку о сжатии. Когда я запускаю ручное сжатие, я получаю то же самое:



$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack


кто-нибудь знает, что с этим делать?



из cat-файла я получаю это:



$ git cat-file -t 3813783126d41a3200b35b6681357c213352ab31
error: unable to find 3813783126d41a3200b35b6681357c213352ab31
fatal: git cat-file 3813783126d41a3200b35b6681357c213352ab31: bad file


и от git fsck я получаю это (не знаю, связано ли это на самом деле):



$ git fsck
error: inflate: data stream error (invalid distance too far back)
error: corrupt loose object '45ba4ceb93bc812ef20a6630bb27e9e0b33a012a'
fatal: loose object 45ba4ceb93bc812ef20a6630bb27e9e0b33a012a (stored in .git/objects/45/ba4ceb93bc812ef20a6630bb27e9e0b33a012a) is corrupted


может кто - нибудь помочь мне расшифровать это?

610   20  

20 ответов:

похоже, у вас есть поврежденный объект дерева. Вам нужно будет получить этот объект от кого-то другого. Надеюсь, у них будет некоррумпированная версия.

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

принять посмотри на Git Screencasts Скотта Чакона относительно внутренних органов git. Это покажет вам, как git работает под капотом и как заниматься этой детективной работой, если вы действительно застряли и не можете получить этот объект от кого-то другого.

у меня была такая же проблема (не знаю почему).

это исправление требует доступа к неповрежденной удаленной копии репозитория и сохранит вашу локально рабочую копию неповрежденной.

но у него есть некоторые недостатки:

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

исправления

выполнить эти команды из родительского каталога над вашим РЕПО (замените " foo " на имя вашей папки проекта):

  1. создайте резервную копию поврежденного каталога:
    cp -R foo foo-backup
  2. сделать новый клон удаленного репозитория в новый каталог:
    git clone [email protected]:foo foo-newclone
  3. удалить поврежденный .подкаталог ЖКТ:
    rm -rf foo/.git
  4. переместить вновь созданные .подкаталог git в foo:
    mv foo-newclone/.git foo
  5. удалить остальные временный новый клон:
    rm -rf foo-newclone

на Windows вам нужно будет использовать:

  • copy вместо cp -R
  • rmdir /S вместо rm -rf
  • move вместо mv

теперь foo имеет свой оригинал .git подкаталог назад, но все локальные изменения все еще там. git status,commit,pull,push и т. д. снова работают как надо.

ваш лучший выбор, вероятно, просто повторно клонировать из удаленного РЕПО (т. е. Github или другие). К сожалению, вы потеряете все неопущенные коммиты и сохраненные изменения, однако ваша рабочая копия должна остаться нетронутой.

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

rm -fr .git
git init
git remote add origin [your-git-remote-url]
git fetch
git reset --mixed origin/master
git branch --set-upstream-to=origin/master master  

затем зафиксируйте все измененные файлы по мере необходимости.

работая на виртуальной машине, в моем ноутбуке батарея умерла, получила эту ошибку;

ошибка: объект файл .в Git/объекты/се/воль пуста ошибка: объект файл.в Git/объекты/се/воль пуст роковой: свободный воль объекта (хранится внутри .git / objects / ce / theRef) поврежден

мне удалось заставить РЕПО снова работать только с 2 командами и не теряя работу (измененные файлы / незафиксированные изменения)

find .git/objects/ -size 0 -exec rm -f {} \;
git fetch origin

после этого я побежал git status, РЕПО было в порядке, и были мои изменения (ожидающие фиксации, сделайте это сейчас..).

git версия 1.9.1

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

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

однако, когда я попытался запустить git status Я получил

error: object file .git/objects/xx/12345 is empty
fatal: loose object xx12345 (stored in .git/objects/xx/12345 is corrupt

в отличие от большинства других ответов, я не пытался восстановить. Мне просто нужно было Git, чтобы перестать жаловаться на пустой объектный файл.

обзор

"объектный файл" - это хэш git представление реального файла, о котором вы заботитесь. Git думает, что он должен иметь хэшированную версию some/file.whatever хранящиеся в .git/object/xx/12345, и исправление ошибки оказалось в основном вопросом выяснения того, какой файл должен был представлять "свободный объект".

подробности

возможные варианты, казалось, были

  1. удалить пустой файл
  2. получить файл в состояние, приемлемое для Git

подход 1: удалите объект файл

первое, что я попытался было просто переместить файл объекта

mv .git/objects/xx/12345 ..

это не сработало - ГИТ начал жаловаться на сломанную ссылку. На подходе 2.

подход 2: исправить файл

Линус Торвальдс имеет большую запись как восстановить объектный файл это решило проблему для меня. Основные шаги приведены ниже.

$> # Find out which file the blob object refers to
$> git fsck
broken link from    tree 2d9263c6d23595e7cb2a21e5ebbb53655278dff8
           to    blob xx12345
missing blob xx12345

$> git ls-tree 2d926
...
10064 blob xx12345  your_file.whatever

это говорит вам, какой файл пустой объект должен быть хэшем. Сейчас вы можете его починить.

$> git hash-object -w path/to/your_file.whatever

после этого я проверил .git/objects/xx/12345, он больше не был пуст, и ГИТ перестал жаловаться.

попробовать

git stash

это сработало для меня. Он прячет все, что вы не совершили, и это обошло проблему.

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

я начал с того, что посмотрел, сколько коммитов я не нажал на удаленное РЕПО, таким образом:

gitk &

если вы не используете этот инструмент, это очень удобно - доступно на всех операционных системах насколько я знаю. Это означало, что на моем пульте отсутствовали два коммита. Поэтому я нажал на метку, указывающую на последнюю удаленную фиксацию (обычно это будет /remotes/origin/master), чтобы получить хэш (хэш составляет 40 символов в длину, но для краткости я использую 10 здесь - это обычно работает в любом случае).

вот это:

14c0fcc9b3

затем я нажимаю на следующую фиксацию (т. е. первую, которую не имеет удаленный) и получаю хэш:

04d44c3298

затем я использую оба из них, чтобы сделать патч для этого совершают:

git diff 14c0fcc9b3 04d44c3298 > 1.patch

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

git diff 04d44c3298 fc1d4b0df7 > 2.patch

затем я перешел в новый каталог, клонировал РЕПО с пульта дистанционного управления:

git clone [email protected]:username/repo.git

затем я переместил файлы исправлений в новую папку, применил их и зафиксировал их с их точными сообщениями фиксации (они могут быть вставлены из git log или gitk окно):

patch -p1 < 1.patch
git commit

patch -p1 < 2.patch
git commit

это восстановило вещи для меня (и обратите внимание, что, вероятно, есть более быстрый способ сделать это для большого количества коммитов). Однако я очень хотел посмотреть, можно ли восстановить дерево в поврежденном РЕПО, и ответ-это может быть. С восстановленным РЕПО, доступным, как указано выше, выполните эту команду в сломанной папке:

git fsck 

вы получите что-то вроде этого:

error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d

чтобы сделать ремонт, я бы сделал это в сломанном папка:

rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d

т. е. удалить поврежденный файл и заменить его хорошим. Возможно, вам придется сделать это несколько раз. Наконец, будет точка, где вы можете запустить fsck без ошибок. Вероятно, у вас будут строки "dangling commit" и "dangling blob" в отчете, это следствие ваших перестановок и исправлений в этой папке, и все в порядке. Сборщик мусора со временем их удалит.

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

в ответе @user1055643 отсутствует последний шаг:

$ rm -fr .git
$ git init
$ git remote add origin your-git-remote-url
$ git fetch
$ git reset --hard origin/master
$ git branch --set-upstream-to=origin/master master  

Я также получал поврежденную ошибку свободного объекта.

./objects/x/x

Я успешно исправил это, перейдя в каталог поврежденного объекта. Я видел, что пользователи, назначенные этому объекту, были не мой ЖКТ пользователя. Я не знаю, как это произошло, но я побежал chown git:git на этот файл, а затем он снова работал.

Это может быть потенциальное исправление для некоторых народов, но не обязательно все из них.

A вывоз мусора исправлена моя проблема:

git gc --aggressive --prune=now

требуется некоторое время для завершения, но каждый свободный объект и/или поврежденный индекс был исправлен.

Я получил эту ошибку после того, как моя (windows) машина решила перезагрузиться. К счастью, мое удаленное РЕПО было обновлено, поэтому я просто сделал свежий git-клон..

я следовал многим другим шагам здесь; описание Линуса о том, как смотреть на дерево/объекты git и находить то, что отсутствует, было особенно полезно. git-git восстановить поврежденный blob

но в конце концов, для меня у меня были свободные/поврежденные объекты дерева, вызванные частичным сбоем диска, и объекты дерева не так легко восстанавливаются/не покрываются этим документом.

В конце концов, я переехал конфликтующих objects/<ha>/<hash> с дороги, и используется git unpack-objects с файлом пакета от достаточно современного клона. Он смог восстановить отсутствующие объекты дерева.

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

Runnning git stash; git stash pop исправлена моя проблема

для меня это произошло из-за сбоя электропитания во время git push.

сообщения выглядели так:

$ git status
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
fatal: loose object c238824eb3fb602edc2c49fccb535f9e53951c74 (stored in .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74) is corrupt

я пробовал такие вещи, как git fsck но это не помогло. Так как авария произошла во время git push, это, очевидно, произошло во время перезаписи на стороне клиента, которая происходит после обновления сервера. Я огляделся и понял, что c2388 в моем случае был объект фиксации, потому что на него ссылались записи в .git/refs. Так что я знал, что буду быть в состоянии найти c2388 когда я смотрю на историю (через веб-интерфейс или второй клон).

на втором клоне я сделал git log -n 2 c2388 чтобы определить предшественника c2388. Затем я вручную изменил .git/refs/heads/master и .git/refs/remotes/origin/master быть предшественником c2388 вместо c2388. Тогда я мог бы сделать git fetch. Элемент git fetch не удалось несколько раз для конфликтов на пустых объектах. Я удалил каждый из этих пустых объектов, пока git fetch удалось. Это исцелило хранилище.

Я решил этот путь: Я решил просто скопировать неповрежденный объектный файл из Клона резервной копии в мой исходный репозиторий. Это сработало так же хорошо. (Кстати: если вы не можете найти объект .git / objects/ по его имени, он, вероятно, был [упакован][пакет] для экономии места.)

У меня была такая же проблема в моем голом удаленном РЕПО git. После долгих поисков неисправностей я выяснил, что один из моих коллег сделал фиксацию, в которой некоторые файлы .git / объекты имели разрешения 440 (r--r-----) вместо 444 (r--r--r--). После того, как сотрудник попросил изменить разрешения с помощью "chmod 444-R objects" внутри голого репозитория git, проблема была исправлена.

у нас только что был здесь. Случилось так, что проблема заключалась в том, что владельцем поврежденного файла был root вместо нашего обычного пользователя. Это было вызвано фиксацией, сделанной на сервере после того, как кто-то сделал "sudo su --".

во-первых, определите свой поврежденный файл с помощью:

$> git fsck --full

вы должны получить такой ответ:

fatal: loose object 11b25a9d10b4144711bf616590e171a76a35c1f9 (stored in .git/objects/11/b25a9d10b4144711bf616590e171a76a35c1f9) is corrupt

зайдите в папку, где находится поврежденный файл и сделайте:

$> ls -la

регистрация права собственности на поврежденный файл. Если это другое, просто вернитесь к корню вашего РЕПО и сделайте:

$> sudo chown -R YOURCORRECTUSER:www-data .git/

надеюсь, что это помогает!

у меня просто была такая проблема. Моя конкретная проблема была вызвана системным сбоем, который повредил самую последнюю фиксацию (и, следовательно, также главную ветвь). Я не настаивал, и хотел снова сделать это обязательство. В моем конкретном случае я смог справиться с этим так:

  1. создать резервную копию .git/:rsync -a .git/ git-bak/
  2. Регистрация .git/logs/HEAD, и найти последнюю строку с допустимым идентификатором. Для меня это был второй последний коммит. Это было хорошо, потому что У меня все еще были рабочие версии каталога файла, и поэтому каждая версия, которую я хотел.
  3. сделать ветку на этом фиксации:git branch temp <commit-id>
  4. повторите сломанную фиксацию с файлами в рабочем каталоге.
  5. git reset master temp чтобы переместить главную ветвь к новой фиксации, которую вы сделали на Шаге 2.
  6. git checkout master и проверьте, что он выглядит правильно с git log.
  7. git branch -d temp.
  8. git fsck --full, и теперь должно быть безопасно удалять любые поврежденные объекты, которые находит fsck.
  9. если все это выглядит хорошо, попробуйте нажать. Если это сработает,

это сработало для меня. Я подозреваю, что это довольно распространенный сценарий, так как самый последний коммит, скорее всего, будет поврежден, но если вы потеряете еще один, вы, вероятно, все еще можете использовать такой метод, с осторожным использованием git cherrypick, и reflog в .git/logs/HEAD.

когда у меня была эта проблема, я скопировал свои последние изменения (поскольку я знал, что я изменил), а затем удалил этот файл, на который он жаловался .ГИТ/расположение. Затем я сделал ГИТ тянуть. Будьте осторожны, хотя, это может не работать для вас.

просто удалить .git папка и добавить его снова. Это простое решение сработало для меня.

Comments

    Ничего не найдено.