Git не удается разрешить ссылки при нажатии

У меня проблема с Git. По неизвестным причинам моя главная ветвь каким-то образом испортилась. У меня есть локальная фиксация, которую я хочу нажать, но когда я нажимаю, я получаю следующее:

git push origin master
error: unable to resolve reference refs/remotes/origin/master: No such file or directory
error: cannot lock the ref 'refs/remotes/origin/master'.
Everything up-to-date

Я видел проблему на других платах, но обычно ссылаюсь на pulls, а не на нажатия. Тем не менее, я пробовал свои решения, но безуспешно:

  • Исправлено изменение моей текущей фиксации и нажатие
  • очистил мой репозиторий git с помощью git gc --prune=now
  • Пробовал rm .git/refs/removes/origin/master

Никто не решил мои проблемы. Любые мысли или идеи?

Ответы

Ответ 1

(стоящий tl; dr из @NeTeInStEiN:

Ядерная опция rm -rf .git/refs/remotes/origin, и что она здесь взяла)

edit: Я столкнулся с частью этого поведения в одном из своих собственных репозиториев, я могу получить git, чтобы воспроизвести сбой f-e-r без rm .git/refs/remotes/origin/master hack:

  • клонировать репо
  • удалить начальную ветвь происхождения (к которой привязан ее HEAD)
  • запустите git fetch --prune в клоне

Извлечение будет выдавать предупреждение об ошибке, и git for-each-ref завершится неудачно с знакомым сообщением:

~/sandbox/20/buddy$ git fetch --prune
From /home/jthill/sandbox/20/source/.
 x [deleted]         (none)     -> origin/master
   (refs/remotes/origin/HEAD has become dangling)
~/sandbox/20/buddy$ git f-e-r
fatal: missing object 0000000000000000000000000000000000000000 for refs/remotes/origin/HEAD

но это не разрушает нажатие, я пробовал с каждой настройкой push.default и не разбивал git update-ref -d.

Тем не менее, googling push-сообщение получило мне следующее:

Я только что перезагрузился с BSOD на днях [...], затем git push. И вот когда я получил жалобу о "Не удалось разрешить ссылки refs/remotes/origin/master..." . [...] Итак, я открыл мастер файл, и он был заполнен пробелами! Ну, это нехорошо. Чтобы исправить это, я сделал следующее: [ваш rm, а затем git fetch]


См. комментарии выше для "blow-by-blow" , tl; dr, потому что это были удаленные ссылки, которые git fetch полностью обновляется, а также потому, что ущерб был таким, что for-each-ref и git update-ref не удалось вообще работать, ядерная опция rm -rf refs/remotes/origin; git fetch гарантировала бы правильное восстановление пульта.

В других случаях, если бы не было простого способа восстановить поврежденные ссылки или любопытство, find .git/refs/remotes/origin -type f для проверки блокировок или использования журналов (эти файлы находятся в .git/logs), чтобы восстановить содержимое, помогло бы, но здесь не было необходимости. Я думаю, что я пропустил ставку, не сделав здесь find первых, *.lock файлов из более ранней команды kill -9 ed, вероятно, здесь, но я подозревал, что для них первый двусмысленный реф и f-e-r.


Ответ 2

Примечание: с Git 2.5 (июль 2015 г.) git for-each-ref будет немного более точным, если он не пройдет с "отсутствующим объект".

См. commit 501cf47, commit f551707 (03 июня 2015) и commit 8afc493, совершить c3e23dc ​​ (02 июня 2015) Майкл Хаггерти (mhagger).
(слияние Junio ​​C Hamano - gitster - в commit 9d71c5f, 24 июня 2015 г.)

for-each-ref: правильно сообщать о неправильных ссылках

Если есть свободный файл ссылки с недопустимым содержимым, "git for-each-ref" неправильно сообщает о проблеме как о пропавшем без вести объект с именем NULL_SHA1:

$ echo '12345678' >.git/refs/heads/nonsense
$ git for-each-ref
fatal: missing object 0000000000000000000000000000000000000000 for refs/heads/nonsense

С явной строкой "--format" она даже может сообщить, что ссылка действительно указывает на NULL_SHA1:

$ git for-each-ref --format='%(objectname) %(refname)'
0000000000000000000000000000000000000000 refs/heads/nonsense
$ echo $?
0

NULL_SHA1 используется для обозначения "invalid object name" на протяжении всего нашего кода (и кода других реализаций Git), поэтому значительно больше вероятно, что ссылка на диске была установлена ​​на это значение из-за ошибка программного обеспечения, чем это NULL_SHA1 является законным SHA-1 фактического объект.
Следовательно, если свободная ссылка имеет значение NULL_SHA1, считайте его сломанным.