Репозиторий Git сломан после смерти компьютера

95

Мой компьютер отключился, и теперь один из моих репозиториев 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
вайноло
источник
Можете ли вы проверить, .git/refs/heads/masterсуществует ли и является ли его содержимое действительным хешем фиксации вашего репозитория (вы можете проверить это, например, используя git show <hash>)?
poke
Я знаю, что это очевидно, но все же спрашиваю - есть ли у вас удаленные репозитории одного и того же репозитория git?
Tuxdude
@poke содержание .git/refs/heads/master/- куча^@
vainolo
@Tuxdude да, но не обновлены до моих последних изменений
vainolo 09
1
Что git reflogвам сказать? Вы пробовали бегать git fsck?
kynan 09

Ответы:

175

Мне удалось вылечиться через:

rm .git/refs/remotes/origin/HEAD
git fetch --all
Jfrumar
источник
В моем случае это произошло из-за того, что я удалил некоторые локальные и удаленные ветки (каким-то образом файл .git / refs / remotes / origin / HEAD остался в несогласованном состоянии). Изменение содержимого вышеупомянутого файла так, чтобы оно указывало на существующую локальную ветвь (например, ref: refs / remotes / origin / master), решило эту проблему. Тем не менее, описанный выше подход может быть лучше, поскольку HEAD может указывать на фиксацию не в текущей ветке.
crissdev
В случае , если проблема происходит с конкретным мерзавцем субмодуля, то первая команда немного меняетсяrm <root repository path>/.git/modules/<path to the submodule>/refs/remotes/origin/HEAD
GOBE
1
Я должен был это сделать rm -rf .git/refs/remotes/origin, но ты указал мне правильное направление
Джека
24

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

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

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

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

Кинан
источник
Я посмотрел .git/logs/refs/heads/mybranch. Показывает какую-то историю коммитов в эту ветку. Покопавшись в этом, я выбрал SHA и попытался отобразить их с помощью git show. (У каждого коммита есть два SHA, я выбрал второй, прямо перед именем автора.) Последний был поврежден, но предыдущий мог быть git shown, и я смог затем протолкнуть его git push origin abcdef:mybranch.
Эд Авис
13

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

В этом месте у меня был файл ...

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

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

NB у меня не было никаких изменений / коммитов

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

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

Карлтон
источник
6

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

  1. сделайте резервную копию файлов, которые вы изменили в репо
  2. удалить существующее репо
  3. повторно клонировать его с сервера
  4. вставьте файлы с шага 1 в репо и git commit -a
Alsotang
источник
да, никто не мог подумать о повторном клонировании. отличное предложение
Селман Генч
5

мне удалось решить эту проблему, удалив главный файл в каталоге git \ refs \ Heads

Манос Гайтанакис
источник
Это помогло, оно удалило ветку из моего списка на intellij, и я проверил ее как новую ветку. К счастью, я внес свои изменения, так что все они были там.
OAM
4

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

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

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

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

j4v1
источник
2

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

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

  • Резервное копирование последних изменений во временную папку
  • перейти на «чистый лист»
    • git checkout master
    • git reset --hard
  • проверить предпоследнюю фиксацию в журнале
  • создать ветку из этой отделенной головы
  • ОТ СЕБЯ
  • Восстановить последние изменения
  • Зафиксировать снова

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

Маркус Палсер
источник
2

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

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

git fetch --all
Кеон Садатян
источник
1

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

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

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

коричневый
источник
1

Мой компьютер дважды выходил из строя, и в результате мой репозиторий git был сломан локально. Я не мог вытащить свои изменения, он попросил установить удаленное происхождение, но в gitKraken это не сработало.

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

Я знал, что мои ссылки не работают и их нужно исправить. Что мне нужно было сделать, так это git bash (в SourceTree щелкните «терминал»). Затем перейдите в папку ссылок, подобную этой

cd .git
cd refs
cd remotes
cd origin

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

бац, поврежденного файла нет. Теперь, если вы введете команду git branch -a, она выведет это

$ git branch -a
* master
  remotes/origin/master (this in red color -scary :) )

Затем введите эту команду, и она исправит ваши ссылки

$ git remote set-head origin master

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

введите описание изображения здесь

Хаммад Хан
источник
0

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

Самуэленс
источник
0

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

винниф
источник
0

У меня была такая же проблема, когда 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 --

запрет на геоинжиниринг
источник
0

Простите, если я буду повторять за кем-то (я еще не прочитал все отзывы). На мой взгляд, самый простой способ решить проблему - скопировать проект без .git и .idea, очистить его, клонировать из git, удалить все, кроме указанных выше каталогов, а затем вставить предыдущую копию во вновь созданное репо с .git и .idea . Надеюсь, это имеет смысл.

Андрей Сулай
источник