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
может кто - нибудь помочь мне расшифровать это?
20 ответов:
похоже, у вас есть поврежденный объект дерева. Вам нужно будет получить этот объект от кого-то другого. Надеюсь, у них будет некоррумпированная версия.
вы можете фактически восстановить его, если вы не можете найти действительную версию от кого-то другого, угадав, какие файлы должны быть там. Вы можете увидеть, если даты и время объектов совпадают с ним. Это могут быть связанные капли. Вы можете вывести структуру объекта дерева из этих объектов.
принять посмотри на Git Screencasts Скотта Чакона относительно внутренних органов git. Это покажет вам, как git работает под капотом и как заниматься этой детективной работой, если вы действительно застряли и не можете получить этот объект от кого-то другого.
у меня была такая же проблема (не знаю почему).
это исправление требует доступа к неповрежденной удаленной копии репозитория и сохранит вашу локально рабочую копию неповрежденной.
но у него есть некоторые недостатки:
- вы потеряете запись любых коммитов, которые не были нажаты, и должны будете их возобновить.
- Вы потеряете все заначки.
исправления
выполнить эти команды из родительского каталога над вашим РЕПО (замените " foo " на имя вашей папки проекта):
- создайте резервную копию поврежденного каталога:
cp -R foo foo-backup- сделать новый клон удаленного репозитория в новый каталог:
git clone [email protected]:foo foo-newclone- удалить поврежденный .подкаталог ЖКТ:
rm -rf foo/.git- переместить вновь созданные .подкаталог git в foo:
mv foo-newclone/.git foo- удалить остальные временный новый клон:
rm -rf foo-newcloneна Windows вам нужно будет использовать:
copyвместоcp -Rrmdir /Sвместоrm -rfmoveвместо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, и исправление ошибки оказалось в основном вопросом выяснения того, какой файл должен был представлять "свободный объект".подробности
возможные варианты, казалось, были
- удалить пустой файл
- получить файл в состояние, приемлемое для 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с файлом пакета от достаточно современного клона. Он смог восстановить отсутствующие объекты дерева.все равно оставил меня с большим количеством болтающихся капель, которые могут быть побочным эффектом распаковки ранее заархивированных вещей и рассмотрены в других вопросах здесь
для меня это произошло из-за сбоя электропитания во время
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/надеюсь, что это помогает!
у меня просто была такая проблема. Моя конкретная проблема была вызвана системным сбоем, который повредил самую последнюю фиксацию (и, следовательно, также главную ветвь). Я не настаивал, и хотел снова сделать это обязательство. В моем конкретном случае я смог справиться с этим так:
- создать резервную копию
.git/:rsync -a .git/ git-bak/- Регистрация
.git/logs/HEAD, и найти последнюю строку с допустимым идентификатором. Для меня это был второй последний коммит. Это было хорошо, потому что У меня все еще были рабочие версии каталога файла, и поэтому каждая версия, которую я хотел.- сделать ветку на этом фиксации:
git branch temp <commit-id>- повторите сломанную фиксацию с файлами в рабочем каталоге.
git reset master tempчтобы переместить главную ветвь к новой фиксации, которую вы сделали на Шаге 2.git checkout masterи проверьте, что он выглядит правильно сgit log.git branch -d temp.git fsck --full, и теперь должно быть безопасно удалять любые поврежденные объекты, которые находит fsck.- если все это выглядит хорошо, попробуйте нажать. Если это сработает,
это сработало для меня. Я подозреваю, что это довольно распространенный сценарий, так как самый последний коммит, скорее всего, будет поврежден, но если вы потеряете еще один, вы, вероятно, все еще можете использовать такой метод, с осторожным использованием
git cherrypick, и reflog в.git/logs/HEAD.
когда у меня была эта проблема, я скопировал свои последние изменения (поскольку я знал, что я изменил), а затем удалил этот файл, на который он жаловался .ГИТ/расположение. Затем я сделал ГИТ тянуть. Будьте осторожны, хотя, это может не работать для вас.
Comments