Всякий раз, когда я вытаскиваю из своего пульта, я получаю следующую ошибку о сжатии. Когда я запускаю ручное сжатие, я получаю то же самое:
$ 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
Может кто-нибудь помочь мне расшифровать это?
git
version-control
asgerhallas
источник
источник
Ответы:
Похоже, у вас есть поврежденный объект дерева. Вам нужно будет получить этот объект от кого-то еще. Надеюсь, у них будет нетленная версия.
Вы могли бы на самом деле восстановить его, если не можете найти действительную версию от кого-то другого, угадав, какие файлы должны быть там. Возможно, вы захотите посмотреть, соответствуют ли даты и время объектов. Это могут быть связанные пятна. Из этих объектов можно вывести структуру дерева.
Взгляните на скриншоты Скотта Чакона о Git . Это покажет вам, как работает git под капотом и как выполнять эту детективную работу, если вы действительно застряли и не можете получить этот объект от кого-то другого.
источник
git cat-file -t <SHA1>
скажу вам тип. Если он не поврежден, вы можетеgit cat-file <type> <SHA1>
просмотреть его содержимое (я использовал его дляblob
, я думаю, оно также покажет вам содержимое других типов).blob
. Однако, когда я следовал этим инструкциям,git status
ответил,fatal: unable to read <SHA1>
даже если я успешно запустилсяgit hash-object -w <file>
(вероятно, потому что, согласно его инструкциям, я переместил этот объектный файл. Возвращение его просто дало мне ту жеcorrupt loose object
ошибку.)У меня была такая же проблема (не знаю почему).
Это исправление требует доступа к не поврежденной удаленной копии хранилища и сохранит вашу локальную рабочую копию нетронутой.
Но у него есть некоторые недостатки:
Исправление
Выполните эти команды из родительского каталога над вашим репозиторием (замените 'foo' именем папки вашего проекта):
cp -R foo foo-backup
git clone git@www.mydomain.de:foo foo-newclone
rm -rf foo/.git
mv foo-newclone/.git foo
rm -rf foo-newclone
В Windows вам нужно будет использовать:
copy
вместо тогоcp -R
rmdir /S
вместо тогоrm -rf
move
вместо тогоmv
Теперь у foo есть свой исходный
.git
подкаталог, но все локальные изменения все еще там.git status
,commit
,pull
,push
И т.д. работа снова , как они должны.источник
.git
папки.Лучше всего, вероятно, просто переклонировать из удаленного репо (т.е. Github или другой). К сожалению, вы потеряете все невыполненные коммиты и сохраненные изменения, однако ваша рабочая копия должна остаться нетронутой.
Сначала сделайте резервную копию ваших локальных файлов. Затем сделайте это из корня вашего рабочего дерева:
Затем зафиксируйте любые измененные файлы по мере необходимости.
источник
master
на имя ветви.working
когда она была повреждена, и эти шаги не дали мне локальную копию какой-либо ветки, кроме master (и да, я пытался заменить master выше,working
но это не сработало). В итоге я выполнил вышеописанные шагиmaster
, затем спрятал мои изменения и сделалcheckout -b working origin/working
там сундук . Кажется, сработало - спасибо!git status
далиfatal: Not a git repository: submodules/my-sub/../../.git/modules/my-sub
. Удаление субмодуля из файловой системы и перезапуск процесса восстановили нормальность. Вероятно, сначала нужно убедиться, что в подмодулях нетРаботая на ВМ, у меня в ноутбуке аккумулятор сдох, получил эту ошибку;
Мне удалось заставить репо работать снова, используя всего 2 команды и не теряя своей работы (измененные файлы / незафиксированные изменения)
После этого я запустил
git status
репо, все было в порядке, и произошли мои изменения (в ожидании подтверждения, сделайте это сейчас ..).GIT версия 1.9.1
Не забудьте сделать резервную копию всех изменений, которые вы помните, на случай, если это решение не сработает и потребуется более радикальный подход.
источник
find .git/objects/ -size 0 -exec rm -f {} \;
у меня работает;)git symbolic-ref HEAD refs/heads/master.
после удаления пустых объектов.Мой компьютер вышел из строя, когда я писал сообщение о коммите. После перезагрузки рабочее дерево было таким, каким я его оставил, и я смог успешно зафиксировать свои изменения.
Однако, когда я попытался бежать,
git status
я получилВ отличие от большинства других ответов, я не пытался восстановить какие-либо данные . Мне просто нужно, чтобы Git перестал жаловаться на пустой объектный файл.
обзор
«Объектный файл» - это хешированное представление git реального файла, который вас интересует. Git считает, что в нем должна
some/file.whatever
храниться хэшированная версия.git/object/xx/12345
, и исправление ошибки оказалось главным образом вопросом выяснения, какой файл должен был представлять «свободный объект».подробности
Возможные варианты казались
Подход 1: Удалить объектный файл
Первым делом я попробовал переместить объектный файл
Это не сработало - git начал жаловаться на неработающую ссылку. На подходе 2.
Подход 2: исправить файл
У Линуса Торвальдса есть отличная статья о том, как восстановить объектный файл, который решил проблему для меня. Ключевые шаги суммированы здесь.
Это говорит вам о том, какой файл должен быть пустым объектом. Теперь вы можете его починить.
После этого я проверил
.git/objects/xx/12345
, он больше не был пустым, и мерзавец перестал жаловаться.источник
Пытаться
Это сработало для меня. Он прячет все, что вы не совершали, и это решает проблему.
источник
git stash
Выполнено следующее: ... fatal: невозможно создать '/home/<user>/.git/index.lock':touch .git/a
касание ошибки ввода / вывода : невозможно касаться '.git / a': ошибка ввода / выводаsudo touch /home/guest/.git/a
НЕТ ОШИБКИgit stash
Нет локальные изменения для сохраненияgit status
... нечегоМусора фиксированная моя проблема:
Требуется некоторое время для завершения, но каждый свободный объект и / или поврежденный индекс был исправлен.
источник
просто
git prune
исправил эту проблему для меняисточник
git pull
занимает немного больше времени, чем обычно, я думаю, потому что он заменяет некоторые удаленные объекты или что-то еще.Я только что испытал это - моя машина разбилась во время записи в репозиторий Git, и она стала поврежденной. Я исправил это следующим образом.
Я начал с рассмотрения того, сколько коммитов я не выдвинул в удаленный репозиторий, поэтому:
Если вы не используете этот инструмент, он очень удобен - насколько мне известно, он доступен во всех операционных системах. Это указывало на то, что на моем пульте не было двух коммитов. Поэтому я нажал на метку, указывающую последний удаленный коммит (обычно это будет
/remotes/origin/master
), чтобы получить хеш (хеш длиной 40 символов, но для краткости я здесь использую 10 - это обычно работает в любом случае).Вот:
Затем я нажимаю на следующий коммит (т. Е. Первый, который удаленный не имеет) и получаю хэш:
Затем я использую оба из них, чтобы сделать патч для этого коммита:
Затем я сделал то же самое с другим отсутствующим коммитом, то есть использовал хэш коммита до и сам хэш коммита:
Затем я переехал в новый каталог, клонировал репозиторий с пульта:
Затем я переместил файлы исправлений в новую папку, применил их и зафиксировал их с точными сообщениями фиксации (их можно вставить из окна
git log
или изgitk
окна):Это восстановило вещи для меня (и заметьте, что, вероятно, есть более быстрый способ сделать это для большого количества коммитов). Однако мне было интересно посмотреть, можно ли отремонтировать дерево в поврежденном репо, и ответ - можно. С восстановленным репо, доступным, как указано выше, выполните эту команду в сломанной папке:
Вы получите что-то вроде этого:
Чтобы сделать ремонт, я бы сделал это в сломанной папке:
т.е. удалите поврежденный файл и замените его на хороший. Возможно, вам придется сделать это несколько раз. Наконец-то наступит момент, когда вы сможете
fsck
без ошибок. Вероятно, в отчете будут строки «висячий коммит» и «висячий блоб», это следствие ваших перебазировок и исправлений в этой папке, и все в порядке. Сборщик мусора удалит их со временем.Таким образом (по крайней мере, в моем случае) поврежденное дерево не означает, что невыдвинутые коммиты будут потеряны.
источник
Я также получал поврежденную ошибку свободного объекта.
Я успешно исправил это, зайдя в каталог поврежденного объекта. Я видел, что пользователи, назначенные этому объекту, были не были моим пользователем git. Я не знаю, как это случилось, но я запустил
chown git:git
этот файл, и он снова заработал.Это может быть потенциальным решением проблем некоторых людей, но не обязательно всех из них.
источник
Я получил эту ошибку после того, как мой (Windows) компьютер решил перезагрузить себя. К счастью, мое удаленное репо было обновлено, поэтому я только что сделал свежий клон гита ...
источник
Runnning
git stash; git stash pop
исправил мою проблемуисточник
Я следовал за многими другими шагами здесь; Описание Линуса о том, как посмотреть на дерево / объекты git и найти то, чего не хватает, было особенно полезно. мерзавец восстановить поврежденный блоб
Но, в конце концов, у меня были незакрепленные / поврежденные объекты дерева, вызванные частичным отказом диска, и объекты дерева не так легко восстановить / не охватывать этим документом.
В конце концов, я убрал конфликтующие
objects/<ha>/<hash>
с пути и использовалgit unpack-objects
файл пакета из достаточно современного клона. Он смог восстановить недостающие объекты дерева.Тем не менее, у меня осталось много висящих блобов, которые могут быть побочным эффектом распаковки ранее заархивированных файлов, а также ответы на другие вопросы здесь.
источник
В ответ @ user1055643 отсутствует последний шаг:
источник
.git
и скопируете из клонированного проекта, репозиторий будет работать, но ни локальные ветви, ни тайники не будут сохранены.У нас только что был случай здесь. Случилось так, что проблема была в том, что владельцем поврежденного файла был root вместо нашего обычного пользователя. Это было вызвано фиксацией, сделанной на сервере после того, как кто-то сделал «sudo su -».
Сначала идентифицируйте ваш поврежденный файл с помощью:
Вы должны получить ответ, подобный этому:
Перейдите в папку, где находится поврежденный файл и выполните:
Проверьте право собственности на поврежденный файл. Если это не так, просто вернитесь в корень вашего репозитория и выполните:
Надеюсь, поможет!
источник
Для меня это произошло из-за сбоя питания при выполнении
git push
.Сообщения выглядели так:
Я пробовал такие вещи,
git fsck
но это не помогло. Поскольку сбой произошел во время agit push
, он, очевидно, произошел во время перезаписи на стороне клиента, которая происходит после обновления сервера. Я оглянулся и понял, чтоc2388
в моем случае это был объект commit, потому что на него ссылались записи в.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 / objects имеют разрешения 440 (r - r -----) вместо 444 (r - r - r). -). После того, как коллега попросил изменить права доступа с помощью «объектов chmod 444 -R» внутри репозитория 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
.источник
Когда у меня возникла эта проблема, я скопировал свои последние изменения (поскольку я знал, что я изменил), а затем удалил этот файл, на который он жаловался, в .git / location. Затем я сделал git pull. Будьте осторожны, это может не сработать для вас.
источник
Я столкнулся с этим, как только моя система сломалась. Что я сделал, это:
(Обратите внимание, что ваши поврежденные коммиты потеряны, но изменения сохраняются. Возможно, вам придется пересоздать эти коммиты в конце этой процедуры)
.git
папку..git
папку.источник
Просто удалите папку .git и добавьте ее снова. Это простое решение сработало для меня.
источник
.git
и скопируете из клонированного проекта, репозиторий будет работать, но не будут сохранены ни локальные ветви, ни тайники. Также, дружеское предложение, полностью удалите свой ответ, чтобы перестать получать отрицательные голоса.