Ошибка git при git pull (невозможно обновить локальную ссылку)


120

У меня есть только мастер ветки, и я получаю эту ошибку каждый раз, когда пытаюсь "git pull":

error: Couldn't set refs/remotes/origin/master
From /var/lib/git/xxx/project
 ! a0f80ea..49177a3  master     -> origin/master  (unable to update local ref)

и когда я выполняю "git pull origin master", я получаю:

error: Couldn't set ORIG_HEAD
fatal: Cannot update the ref 'ORIG_HEAD'.

я искал, но не могу найти почему


2
Где локальный репозиторий? Вы создали его как другого пользователя, чем тот, который вы используете для выполнения извлечения? Похоже на проблему с разрешением файла.
tpg2114 09

Да, вы правы, когда сказали, что владельцем файлов проекта был другой пользователь, теперь мой вопрос кажется таким глупым, но вы дали мне ответ, пожалуйста, сделайте его ответом, чтобы выбрать его как лучший;)
user115561

пожалуйста @ tpg2114 добавьте это в качестве ответа, чтобы выбрать его
user115561

Ответы:


271

Моя команда и я столкнулись с этой ошибкой: не удалось обновить локальную ссылку при извлечении SourceTree.

Мы использовали :

git gc --prune=now

Это удалит все повторяющиеся ссылочные объекты, что должно решить проблему.

Вот несколько ссылок, по которым вы можете узнать больше о ссылках на git и сокращении :

мерзкий совет недели

git-prune документация

ссылки git


1
У меня тоже сработало, то же сообщение, Sourcetree в Windows 7
Джеймс Вестгейт

2
только начал иметь эту проблему. Огромное спасибо! работал отлично!
ddrossi93 04

3
Могут потребоваться обе эти команды: git gc --prune=now git remote prune originиз stackoverflow.com/questions/2998832/…
bryan

1
Я попробовал, git remote prune originно у меня ничего не вышло. Но после этого попробовал это git gc --prune=now, и это сработало! Не уверен, нужны ли они оба в таком порядке или только этот.
Анураг

1
Еще одна загадочная проблема, связанная с gitэтим, приводит к полезной публикации на StackOverflow с кратким решением.
ijoseph

131

Я решил, как показано ниже:

git remote prune origin


6
Эврика! Это действительно сработало. Это как-то связано с переименованными удаленными ветками или чем-то в этом роде. Я не буду пытаться это объяснять.
TheSoftwareJedi

8
Это сделало это для меня, git gc --prune=nowничего не сделало
Josh G

3
тем же. это работает для меня. git gc --prune = теперь у меня не работает.
Тони

18

с помощью команды gitbach line, используйте git update-refдля обновления ссылки на вашу локальную ветку:

$ git update-ref -d refs/remotes/origin/[locked branch name]

затем потяните, используя $ git pull

[locked branch name] - это имя ветки, в которой возникает ошибка из-за несоответствия идентификаторов фиксации.


14

Попробуйте использовать эту команду в корневой папке репозитория git:

rm .git/logs/refs/remotes/origin/master 

Где эта папка в Windows?
Каньон Колоб

Я нашел это. Это тот каталог, в который вы клонировали
Каньон Колоб

12

Я обнаружил то же сообщение об ошибке, пытаясь вытащить из репозитория Bitbuck в мою локальную копию. Также существует только один Мастер веток, и команда git pull origin masterприводит к этому сообщению об ошибке

From https://bitbucket.org/xxx
 * branch            master     -> FETCH_HEAD
error: Couldn't set ORIG_HEAD
fatal: Cannot update the ref 'ORIG_HEAD'.

Решение следующее

  1. git reflog найти номер последней фиксации
  2. git reset --hard <numnber> сбросить до последней фиксации
  3. git pull origin master потянуть снова без ошибок


8

Убедитесь, что запускающий git pullпользователь тот же пользователь, который создал репозиторий. Права доступа к файлу неверны.


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

Я согласен с этим, убедитесь, что владелец и группа настроены на пользователя, желающего вытащить репозиторий ".git" (происходит, если вы вытащили ветку, являющуюся "root"), а "sudo chown -R" выполнила свою работу в моем случае.
jo_


2

Это случилось со мной в OSX, где я использую файловую систему без учета регистра. Каким-то образом другой разработчик подтолкнул ветку с тем же именем, но с другим регистром: My-Branchvsmy-branch .

Я уже My-Branchвыписался и получил сообщение об ошибке «не удается обновить локальную ссылку» при извлечении, вероятно, потому что файловая система считаетMy-Branch ==my-branch .

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


В моем случае обе конфликтующие ветки принадлежали другому пользователю, поэтому я не мог их удалить. Вместо этого я удалил файл ссылки ветки в .git \ refs \ remotes, и это исправило его (временно - проблема будет появляться каждый раз, когда я буду тянуть, пока другой пользователь не удалит одну из своих веток).
Jana Mandic

Моя проблема также была связана с локальным и удаленным филиалами с разными заглавными буквами. Удаление локальной ветки с помощью приведенной выше команды prune и последующее извлечение из источника решило эту проблему
дескриптор

1

Эта ошибка с (невозможно обновить локальную ссылку) также может произойти, если вы недавно изменили пароли и есть некоторые причудливые вещи, интегрирующие ваши логины в Windows и Linux.


1

Говоря от пользователя ПК - перезагрузка.

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


1

Это, вероятно, очень нишевая ситуация, но: я запускаю Windows на виртуальной машине Parallels на моем MacBook Pro, а мои локальные репозитории хранятся на диске виртуальной машины, который используется совместно с macOS.

Если у меня есть файл, открытый в приложении Mac из репозитория, расположенного на виртуальной машине Windows, я иногда получаю сообщение об ошибке «Не удается обновить локальную ссылку». Решение, когда это происходит, - просто закрыть файл или выйти из приложения Mac.


1

У меня была такая же ошибка, я обновлялся из Eclipse, и у меня было много ошибок. Поэтому я попытался выполнить обновление из командного окна DOS и получил ту же проблему.

Затем я попробовал решение «git gc --prune = now». Это выдало сообщение о том, что файлы заблокированы в каталоге refs.

Eclipse, должно быть, заблокировал что-то в каталоге "refs".
Решение, которое я нашел, заключалось в том, чтобы просто закрыть Eclipse. Затем я обновил репозиторий из DOS командой git PULL, и все заработало.


1

Что здесь произошло? Локальные ссылки на ваши удаленные ветки были изменены, и, следовательно, при запуске git pullgit не находит никаких соответствующих удаленных веток и, следовательно, не работает.

git remote prune origin

фактически очищает эти локальные ссылки, а затем запускает git pull снова.

Предложение - Пожалуйста, запустите с --dry-runопцией для безопасности


0

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


0

Эта работа для меня

rm .git/logs/refs/remotes/origin/master 

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

0

Удалите файл .git / logs / refs / remotes / origin / [имя заблокированной ветки]


1
Я сомневаюсь, что это помогает - или вообще работает. Чтобы убедить меня в обратном, пожалуйста, объясните, как это должно работать и почему это должно помочь в решении проблемы. Выделение отличий от, казалось бы, похожего существующего другого ответа было бы бонусом. Особенно тот, за который проголосовал Бабак.
Юннош,

0

Для меня сработало:

git config --global fetch.prune true

Теперь он продолжает автоматически выполнять обрезку.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.