Git репозиторий, поврежденный после смерти компьютера

Мой компьютер отключился, и теперь один из моих репозиториев git сломан. Когда я пытаюсь проверить мастер, он говорит мне:

warning: ignoring broken ref refs/heads/master.
error: Your local changes to the following files would be overwritten by checkout:
        com.vainolo.jdraw2d.releng.p2/pom.xml
Please, commit your changes or stash them before you can switch branches.
Aborting

Когда я выполняю git stash, я получаю:

fatal: bad revision 'HEAD'
fatal: bad revision 'HEAD'
fatal: Needed a single revision
You do not have the initial commit yet

Итак... что я могу сделать?

Обновление Вывод git reflog:

fatal: bad default revision 'HEAD'

Не очень многообещающий... Вывод git fsck:

error: Invalid HEAD
Checking object directories: 100% (256/256), done.
error: unable to unpack 59551f96b4e87a1c14293c19eb548ce6fa1f196f header
error: inflateEnd: stream consistency error (no message)
fatal: loose object 59551f96b4e87a1c14293c19eb548ce6fa1f196f (stored in .git/objects/59/551f96b4e87a1c14293c19eb548ce6fa1f196f) is corrupt

Ответ 1

Мне удалось восстановить:

rm .git/refs/remotes/origin/HEAD
git fetch --all

Ответ 2

Начните с выполнения шагов, предложенных в Восстановление сломанного репозитория git:

  • проверьте, содержит ли .git/refs что-нибудь полезное
  • проверьте git reflog и не получив содержимое .git/logs/refs/heads/master или любой другой ветки, на которой вы были последними
  • запустите git fsck, возможно с помощью --unreachable или --lost-found

Это, мы надеемся, позволит вам выяснить, что должно быть для master ref, чтобы вы могли его восстановить (т.е. верьте SHA1 в .git/refs/heads/master).

В случае, если какой-либо объект, содержащийся в этом коммите, действительно поврежден, вы не можете восстановить ваш HEAD код, к сожалению. Предполагая, что ваше рабочее дерево и/или индекс не повреждены, вы можете попробовать git reset --soft (или с ошибкой git reset) предыдущей фиксации, а затем повторно выполнить фиксацию. Избегайте любых операций, которые меняют рабочее дерево s.a. git checkout -f или git reset --hard.

Ответ 3

У меня была аналогичная проблема после синего экрана смерти на окнах 8.1

У меня был файл в этом месте...

C:\www\<project>\.git\refs\remotes\origin\<problem-branch>

И он был пуст, тогда как другие файлы ветки в этой папке имеют длинные строки внутри них.

NB У меня не было никаких изменений/фиксаций

  • Я создал резервную копию файла <problem-branch>
  • Удаленный файл
  • git fetch --all, чтобы получить ветвь снова

Затем автозаполнение вкладки снова заработало

Ответ 4

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

  • резервное копирование файлов, измененных в репо
  • удалить существующее репо
  • повторно клонировать его с сервера
  • вставьте файлы с шага 1 в репо и git commit -a

Ответ 5

У меня была такая же проблема, но не повезло, я не мог понять эту проблему. Я взял свое репо в сторону, повторно клонировал его с сервера и попытался слиться между ними. Конечно, он показал много файлов, не связанных с моей веткой, но помог изолировать необходимые файлы.

Ответ 6

Убедитесь, что MSWindows создала файлы desktop.ini, которые поддерживают git? это для меня. Как только я удалю их все во вложенных папках каталога .git, он работает.

Ответ 7

У меня возникла такая же проблема, когда Android Studio внезапно прекратилась (из-за потери питания компьютера).

Я решил его, скопировав содержимое моего файла C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\heads\master в файл C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\remotes\origin\master.

(Раньше я также включил опцию "Force Push" в Android Studio, но я не думаю, что это был необходимый шаг.)

Примечание:

Я нашел это решение, сравнив содержимое файлов в каталоге C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\ (вложенные подкаталоги) с соответствующими файлами в другом здоровом проекте - например, C:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\.

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

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

PS - Мое сообщение об ошибке (отредактировано) было: warning: ignoring broken refs/remotes/origin/master.fatal bad revision 'refs/remotes/origin/master..refs/heads/master' during executing git -c core.quotepath=false log refs/remotes/origin/master..refs/heads/master --pretty=format --encoding=UTF-8 -M --name-status -c --

Ответ 8

Я знаю, что это слишком поздний ответ, но я получал эту ошибку, потому что у меня не было origin/head. Вы можете найти это, выполнив git branch -r. Если вы не видите ваш origin/head, указывающий на удаленное начало, вы можете установить это, запустив git remote set-head origin {{your branch name}}.

Теперь запустите git branch -r снова, и вы увидите что-то вроде этого: origin/HEAD -> origin/develop

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

Ответ 9

Я не смог проверить свою основную ветку из-за невозможности блокировки ошибки ref. В итоге я удалил: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

и вызов этой команды git:

git fetch --all

Ответ 10

После вычисленного замораживания и сбоя моя ветвь git была повреждена сообщением: git fatal: your current branch appears to be broken. Я ничего не мог сделать.

После выполнения git fsck упомянул, что ветвь имела error: Invalid HEAD. refs/heads/<branch> имел invalid sha1 pointer.

После выполнения следующих параметров я открыл .git/refs/heads/<branch> в редакторе notepad ++, и каждый из символов sha1 был NUL.

К счастью, мне понадобилось только reset ветвь в удаленное состояние, и это было на реплике bitbucket. Я схватил sha1 с наконечника удаленного репо и скопировал его в .git/refs/heads/<branch>, сохранил его, затем сделал git reset --hard HEAD, и все вернулось в нормальное состояние.

Ответ 11

Я был идиотом, чтобы забыть проталкивать, а мой компьютер разбился во время совершения фиксации. Я мог бы восстановить все, кроме последнего, хотя, открыв .git/журналы/ссылки/главы/

Этот файл содержит все коммиты (со своими SHA) для ветки, что я сделал для восстановления:

  • Резервное копирование последних изменений во временную папку
  • перейти к "чистому сланцу"
    • git checkout master
    • git reset --hard
  • проверить второе и последнее фиксацию в журнале
  • создать ветку из этой отдельной головы
  • PUSH
  • Восстановить последние изменения
  • Повторите попытку

Таким образом, даже если вы совершите туманную ошибку, вы не сразу возвращаетесь на целый день работы с помощью git:)