Git 'фатальный: нет такой ссылки: HEAD'

Странная вещь произошла с моим репозиторием git. Когда я пытаюсь зафиксировать что-то в окне tortoisegit, я получаю все файлы из проекта. Я не могу их вернуть, когда я извлекаю с сервера, я получаю fatal: No such ref: HEAD и fatal: Cannot lock the ref 'HEAD'. Все мои локальные ветки отсутствуют. Есть ли способ решить проблему?

Это не первая фиксация или что-то в этом роде. Это случилось внезапно.

РЕДАКТИРОВАТЬ:

git branch -a говорит: Failed to resolve HEAD as a valid ref

git status распечатывает все файлы проекта, помеченные как новые.

Я изменил имя папки репозитория на некоторое время, и когда я изменил его обратно, все пошло не так.


person szaman    schedule 31.01.2011    source источник
comment
Что ты делал, когда это случилось? Можете ли вы показать результат git status и git branch -a?   -  person CB Bailey    schedule 31.01.2011
comment
Во избежание всяких сомнений, под папкой репозитория вы подразумеваете папку с именем .git?   -  person CB Bailey    schedule 31.01.2011
comment
Нет, папка проекта, которая содержит непосредственно .git   -  person szaman    schedule 31.01.2011
comment
Какую версию git вы используете?   -  person CB Bailey    schedule 31.01.2011
comment
TortoiseGit 1.5.8.0 git версия 1.7.3.1.msysgit.0   -  person szaman    schedule 31.01.2011


Ответы (4)


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

echo ref: refs/heads/master >.git/HEAD

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

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

person CB Bailey    schedule 31.01.2011
comment
Хорошо, я сделал как ты написал. После эха я был в главной ветке, я сделал коммит и смог переключиться на свою основную ветку. Но теперь, когда я пытаюсь переключиться на любую из своих локальных веток, я получаю сообщение «ошибка: pathspec '812' не соответствует ни одному файлу (файлам), известным git». - person szaman; 31.01.2011
comment
@szaman: Я не знаю, но похоже, что отсутствующий HEAD был не единственным, что повреждено в вашем репозитории. Можете ли вы восстановить его из резервной копии или повторно клонировать? - person CB Bailey; 31.01.2011
comment
Я решил ... почти. После того, как я применил ваш совет, я посмотрел журнал репо. Отсутствовала только последняя фиксация, поэтому я создал новую ветку на основе последних 812, которые я нашел. Теперь я могу на него переключиться. Файлы из последней фиксации я могу взять из копии сломанного репозитория, потому что я работал над 812, когда произошел этот сбой. Большое спасибо за помощь - person szaman; 31.01.2011
comment
ты. Я как-то случайно добавил o \ n в HEAD через плагин vim fugitive. Ваш ответ помог найти этот файл. - person Arnis Lapsa; 04.07.2012
comment
Куда мне это писать? - person Boldijar Paul; 10.11.2014
comment
@BoldijarPaul, вы можете запустить его в каталоге своего проекта с .git внутри. - person Yao Li; 06.12.2017
comment
кстати, замените master именем своей ветки, echo ref: refs / Heads / your_branch_name ›.git / HEAD - person Yao Li; 07.12.2017
comment
Вы потеряли ГОЛОВУ, поэтому вам нужно воссоздать ее. > любить это. - person Cokorda Raka; 23.05.2020

HEAD - обычно ссылка на конкретную ветку; в вашем случае кажется, что указатели веток пропали без вести, поэтому ссылка HEAD не может быть разрешена.

Вы можете использовать git fsck --lost-found для сканирования кэша объектов на предмет недоступных объектов; в частности, вас интересуют коммиты, которые можно найти ниже .git/lost-found/commit/; это указатели на ваши ветки, все, что вам нужно сделать, это выяснить, что есть что, и создать новые ссылки с помощью git branch.

person Simon Richter    schedule 31.01.2011
comment
Вы использовали опцию --lost-found? - person Simon Richter; 31.01.2011
comment
Создал ли он каталог lost-found? - person Simon Richter; 31.01.2011
comment
Да, он его создал, но в папке фиксации файлов намного меньше, чем у меня в локальных ветках. - person szaman; 31.01.2011
comment
Вам не будет хватать всех веток, голова которых является родительской фиксацией для другой ветки. Команда git fsck найдет коммиты, на которые не указывает ни другая фиксация, ни указатель ветки, поэтому, если одна ветка находится поверх другой, тогда существует объект фиксации, ссылающийся на другую ветку, поэтому ссылка не создается. - person Simon Richter; 31.01.2011

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

echo ref: refs/heads/master >.git/HEAD

Потом моя ветка изменилась на мастер. Я внес изменения и смог переключиться на свою основную ветку. Проблема заключалась в том, что я не мог использовать ни один из моих локальных филиалов. Особенно я хотел поработать над веткой 812. Итак, я нашел последнюю фиксацию ветки 812 (создание сообщения, когда фиксация очень полезна;)) и переключился на нее. Затем я создал ветку 812 на основе той, на которую я переключился. К сожалению, некоторые файлы отсутствовали. К счастью, они у меня были на сломанном репо, которое я скопировал перед эхом.

person szaman    schedule 31.01.2011

Для меня проблема заключалась в том, что в Mac OS X был установлен флаг uchg или uappnd, блокирующий некоторые файлы git независимо от разрешений. Я сбросил chflags следующим образом, и это решило это для меня:

sudo chflags -R 0000 .
person Hans-Christoph Steiner    schedule 24.04.2012
comment
У меня тоже были проблемы с разрешением в Linux. - person Ciaran Archer; 27.09.2012
comment
да, GNU / Linux будет уважать chflags при монтировании HFS + - person Hans-Christoph Steiner; 09.01.2013