git pull завершается ошибкой «невозможно разрешить ссылку» «невозможно обновить локальную ссылку»


606

Используя git 1.6.4.2, когда я попытался, git pullя получаю эту ошибку:

error: unable to resolve reference refs/remotes/origin/LT558-optimize-sql: No such file or directory
From git+ssh://remoteserver/~/misk5
 ! [new branch]      LT558-optimize-sql -> origin/LT558-optimize-sql  (unable to update local ref)
error: unable to resolve reference refs/remotes/origin/split-css: No such file or directory
 ! [new branch]      split-css  -> origin/split-css  (unable to update local ref)

Я пытался git remote prune origin, но это не помогло.


Ответы:


930

Попробуйте очистить ваш локальный репозиторий с помощью:

$ git gc --prune=now
$ git remote prune origin

man git-gc (1):

git-gc - Cleanup unnecessary files and optimize the local repository

git gc [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune]

       Runs a number of housekeeping tasks within the current repository, such as compressing file revisions
       (to reduce disk space and increase performance) and removing unreachable objects which may have been
       created from prior invocations of git add.

       Users are encouraged to run this task on a regular basis within each repository to maintain good disk
       space utilization and good operating performance.

man git-remote (1):

git-remote - manage set of tracked repositories

git remote prune [-n | --dry-run] <name>

           Deletes all stale remote-tracking branches under <name>. These stale branches have already been
           removed from the remote repository referenced by <name>, but are still locally available in
           "remotes/<name>".            

96
Почему это работает? В чем проблема, которую он исправляет?
Ikke

5
Вторая команда работала на меня. Очевидно, у меня была неправильная ссылка на удаленную ветку, которая была только что создана. Не уверен, как это случилось, но рад, что это было просто исправить. Спасибо Витек!
Дж. Г. Тейлор

1
Это сработало отлично! Я также хотел бы объяснить, что это делает и почему это работает. Спасибо!
ArielSD

4
Будет ли git remote prune originкоманда выполняться на моей локальной рабочей копии или в удаленном хранилище?
user1438038

3
@ user1438038 Он не должен удалять ветки и обновлять только удаленные ссылки в вашей локальной рабочей копии. Более подробная информация здесь: stackoverflow.com/questions/20106712/…
Zengineer

606

Случилось и со мной. В моем случае плохой рефери был мастером, и я сделал следующее:

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

Это заставило git восстановить файл ref. После этого все снова заработало как положено.


1
Я сделал то же самое, и это решило мою проблему. Когда я открыл файл в Notepad ++, он был явно поврежден.
The Mayer

83
убедитесь, что вы выбрали файл, который доставляет вам проблемы, а не мастер
bia.migueis

6
@ bia.migueis: это не повредит ничему, если вы также случайно удалите мастер - он просто обновится и при следующей загрузке.
naught101

2
Если это подмодуль, может быть немного сложно найти ссылку. Сначала проверьте, .gitявляется ли папка, выполнив, ls -laесли нет, просмотрите содержимое файла .gitфайла, чтобы найти фактическую папку .git, в которой находятся ссылки. .gitсодержимое файла в моем случае: gitdir: ../.git/modules/my-submodule-name
CCoder

1
Дважды за последний год я возвращался, чтобы исправить это, и снова, это единственное исправление, которое действительно работает.
Тед

131

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

git gc --prune=now

5
Это сработало. Спасибо за спасение моего дня! @Bernd Любое возможное объяснение команды?
Нащиз

git gc docs здесь
BigRon

1
У меня тоже сработало. Не нужно было бегатьgit remote prune origin
Airwavezx

87

Для меня это работало, чтобы удалить файлы, которые выбрасывают ошибки из папки .git/refs/remotes/origin/.


это сделал это! Но просто из любопытства вы знаете, почему появилась эта ошибка? (все работало нормально, и вдруг однажды эта ошибка появилась). А также знаете ли вы, как удаление файла решило это?
Shreyans

Приятно слышать, что это также исправило это для вас. Честно говоря, я понятия не имею, что привело к появлению ошибки. Я думал, что один из файлов в папке не синхронизирован. Так как ни одно из других исправлений, которые я нашел, не сработало для меня, я использовал это как последнее средство.
Брайан ван Роиджен

Работал отлично! Обратите внимание, что вы должны удалить все файлы, которые вызывают проблему (на основе полученного вами сообщения об ошибке), как если бы вы только удалили один файл и попытались вытащить его, он вернется.
Rayee Roded

1
Одной из возможных причин может быть сбой системы, как я описал в своем ответе . Многие приложения Git с графическим интерфейсом периодически запускают Git в вашем репозитории (для обновления статуса), и если ваша система рушится во время манипуляций со ссылками в Git, они могут переписаться с помощью NULLs.
Давид Ференци Рогожан

53

Попробуй это:

git gc --prune=now

git remote prune origin

git pull

26
Хотя это может ответить на вопрос авторов, в нем отсутствуют некоторые поясняющие слова и / или ссылки на документацию. Фрагменты исходного кода не очень полезны без каких-либо фраз вокруг них. Вы также можете найти, как написать хороший ответ очень полезно. Пожалуйста, отредактируйте свой ответ.
Рой Шефферс

Именно в этом суть. Недостаточно исправить код и все. Я надеюсь, что есть объяснение
Musikero31

1
git gc --prune = теперь обновляет локальный репозиторий, удаляя ненужные файлы. У меня работает нормально.
Василий Гутник

45

Выполните следующие команды:

rm .git/refs/remotes/origin/master

git fetch

git branch --set-upstream-to=origin/master

На всякий случай, если вам нужно узнать, что это такое .git/refs/remotes/origin/master, прочитайте раздел Remotes в Git References .


1
Можете ли вы объяснить, что такое .git / refs / remotes / origin / branchName? Это решение работало для меня
caitcoo0odes

44

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

Возможная первопричина

В моей системе (Windows 7 64-бит), когда BSOD происходит , некоторые из сохраненных справочных файлов (скорее всего , в настоящее время открыты / писалась в BSOD , когда произошло) заменяются NULLсимволами (ASCII 0).

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

пример

Ошибка: cannot lock ref 'refs/remotes/origin/some/branch': unable to resolve reference 'refs/remotes/origin/some/branch': reference broken

Решение: удалите файл%repo_root%/.git/refs/remotes/origin/some/branch


1
Тот же сценарий на Windows 10 64bit - работа в git-репо, когда происходит BSOD. error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken, Попытка git pullпосле удаления первого файла вернулась fatal: update_ref failed for ref 'HEAD': cannot lock ref 'HEAD': unable to resolve reference 'refs/heads/master': reference broken. После удаления второй файл git pull origin masterпрошел успешно.
cjmcdonn

39

У меня возникла та же проблема, и я решил ее, перейдя в файл, в котором он ошибался:

\repo\.git\refs\remotes\origin\master

Этот файл был полон нулей, я заменил его последней версией из github.


2
Была такая же проблема, но файл .git/refs/remotes/origin/masterбыл просто пуст. Решил проблему, удалив ее.
Зиновьев

38

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

Если вы посмотрите на сообщение, оно сообщит вам, какие файлы вам нужно удалить (в частности).

Файлы для удаления находятся под .git/refs/remotes.

Я просто удалил все файлы и запустил gc prune

git gc --prune=now

После этого все работает просто отлично.


В моем случае я просто удаляю .git / refs / remotes, а затем обновляю и перепрошиваю сервер, и это работает.
Фараз Ахмед

Спасибо Ури. В моем случае я просто удалил файлы в refs / remotes / origin / feature и просто сделал - git pull
Deepboy

26

Объяснение : Похоже, что ваши удаленные ветки репо (в Github / bitbucket) были удалены, хотя ваши локальные ссылки не были обновлены и указывают на несуществующие ссылки.

Чтобы решить эту проблему:

git fetch --prune
git fetch --all
git pull

Для дополнительного чтения - ссылка на документацию Github :

git-fetch - загрузка объектов и ссылок из другого репозитория

--Выберите все пульты.

--prune После выборки удалите все удаленные ветви отслеживания, которые больше не существуют на пульте.


1
Это сработало для меня
Оненгие Ричард

1
Спасибо, это сработало для меня.
Сэм

17

git fetch --prune исправил эту ошибку для меня:

[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:25]
[I]> git fetch
error: cannot lock ref 'refs/remotes/origin/user/janek/integration/20170505': 'refs/remotes/origin/user/janek/integration' exists; cannot create 'refs/remotes/origin/user/janek/integration/20170505'
From github.com:zooxco/driving
 ! [new branch]            user/janek/integration/20170505 -> origin/user/janek/integration/20170505  (unable to update local ref)
From github.com:zooxco/driving
[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:30]
[I]> git fetch --prune
 - [deleted]               (none)     -> origin/user/janek/integration

Это предполагает, что ветка-нарушитель была удалена на удаленном компьютере.


Ваш пример кажется неполным: он не показывает то, --pruneчто я вижу. Также proTip: удалите ненужные пароли после вставки примеров.
MarkHu

Вы абсолютно правы - я остановил вывод команды fetch, но я просто включил его в пример. Спасибо за совет по удалению запроса пароля тоже!
marczych

11

Если эта ошибка «невозможно обновить локальную ссылку» повторяется, даже после применения ответа Vojtech Vitek или Мишеля Крамера у вас может возникнуть неправильная ссылка на локальный И главный репозиторий.

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

rm .git/refs/remotes/origin/master
git fetch
git gc --prune=now
git remote prune origin

Постоянное разрешение для меня было достигнуто только после применения обоих исправлений перед push / pull.


1
Спасибо за это. обратите внимание, что я заменил 'master' веткой, которая перестала работать, например - rm .git / refs / remotes / origin / develop
Damien Sawyer

1
Спасибо за ваш ответ, очень помог!
Нафиг

1
Это сработало для меня
Дживан

10

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

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

Для решения таких проблем сделайте извлечение или выборку с пульта.

git remote prune origin

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

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



3

Попробуй это:

git pull origin Branch_Name

Branch_Nameветвь, на которой вы сейчас находитесь.

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

Так вот почему вы получаете это:

! [new branch]      split-css  -> origin/split-css  (unable to update local ref)

2

Для меня у меня был локальный филиал, feature/phase2а удаленный был назван feature/phase2/data-model. Причиной проблемы был конфликт имен, поэтому я удалил свою локальную ветку (вы можете переименовать ее, если в ней есть что-то, что вам нужно сохранить)


Тот же вопрос здесь - наш тоже был Mac / PC случай именования вопрос, который сделал его сложно обнаружить (одно название капитализируются, другой нет - и он работал на компьютере, но не Mac)
рокстеди

2

Если не git gc --prune=nowпоможет вам. (невезение, как я)

Что я сделал, так это удалил проект локально и снова клонировал весь проект.


Это «Я получил сообщение об ошибке, поэтому я купил новый компьютер» - подход, который я не ожидал получить какие-либо отзывы на этом сайте.
Стефан

2

Я использую Tower, и по какой-то причине мое имя папки было .git/refs/remotes/origin/Github. Изменение в нижний регистр .git/refs/remotes/origin/githubрешило проблему.


1

У меня была такая же проблема. я следую за следующими шагами

1) переключите вашу ветку, у которой возникла проблема, на другую ветку

2) удалить эту ветку

3) оформить заказ снова.

Примечание: - Вы можете спрятать незафиксированные изменения и вернуть их снова.



0

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

rm -rf vendor/*
git gc --prune=now
git pull
composer clear-cache
composer update my/package

0

Возникла эта проблема при попытке клонирования из git bundleсозданного файла, ни один из других ответов не сработал, потому что я не мог клонировать репозиторий (поэтому об git gcудалении / редактировании файлов не могло быть и речи).

Был, однако, другой способ исправить это - исходный файл .bundleфайла начинался с:

# v2 git bundle
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d HEAD
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d refs/heads/master
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d refs/heads/master

PACK.......p..x...Kj.0...: (and so on...)

Простое удаление четвертой строки с помощью vim устранило проблему.


0

У меня была эта проблема при использовании SourceTree. Я попытался снова вытащить, и это сработало. Я думаю, что я слишком быстро колдовал (оформить заказ) :).

Моя ситуация немного отличается от ситуации с постером, потому что мой репозиторий был относительно кооперативным, без каких-либо явных искажений.


0
 # remove the reference file of the branch "lost"
 rm -fv ./.git/refs/remotes/origin/feature/v1.6.9-api-token-bot-reader

 # get all the branches from the master
 git fetch --all

 # git will "know" how-to handle the issue from now on
 #     From github.com:futurice/senzoit-www-server
 # * [new branch]      feature/v1.6.9-api-token-bot-reader ->
 # origin/feature/v1.6.9-api-token-bot-reader

 # and push your local changes
 git push

0

Столкнулся с той же проблемой, когда хранилище было удалено и создано с тем же именем. Это сработало только когда я переустановил удаленный URL, как показано ниже;

git origin set-url origin [GIT_REPO_URL]

Проверьте удаленный URL:

git remote -v

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


0

Просто столкнулся с проблемой сегодня.

Метод устранения неполадок: с помощью SourceTree на серверах Windows вы можете попробовать запустить его как администратор. Это решает мою проблему «не удалось обновить локальную ссылку» в Atlassian Source Tree 2.1.2.5 на Windows Server 2012 R2 в домене.

Если вы можете слишком повторить эту ситуацию, это доказывает, что проблема вызвана проблемой разрешения. Лучше детализировать и найти основную причину - вероятно, некоторые конкретные файлы принадлежат другим пользователям и тому подобное - в противном случае есть нежелательный побочный эффект: вам придется запускать SourceTree в качестве Администратора до конца вечности.


Ну, я бы не рекомендовал это. Вы получите еще больше файлов с неправильными разрешениями. И вам нужно будет запускать все, что манипулирует файлами репозитория от имени администратора. Не лучше ли просто исправить разрешения в первую очередь?
Давид Ференци Рогожан

Вы правы. Но только после того, как я сделал это как администратор, я понял, что это проблема с разрешениями. Так что это был шаг в моей процедуре диагностики, а не идеальное решение как таковое.
Лионет Чен

Конечно. Но многие пользователи могут просто принять ваш ответ как решение, не зная последствий. Может быть, лучше, если вы добавите фиксирование разрешений в качестве предлагаемого решения.
Дэвид Ференци Рогожан

0

Записать конкретный случай, который может вызвать эту проблему.

Однажды я нажал на ветку с именем «feature / subfeature», имея ветку «feature» на пульте.

Эта операция работала нормально без каких-либо ошибок на моей стороне, но когда мои коллеги извлекли и / или вытащили какую-либо ветку, у всех них было одно и то же сообщение об ошибке unable to update local ref,cannot lock ref 'refs/remotes/origin/feature/subfeature .

Это было решено удалением featureветки на remote ( git push --delete origin feature) и последующим запуском git remote prune originрепо моего коллеги, которое генерировало сообщения, включая* [pruned] origin/feature .

Итак, я предполагаю, что git fetchпытался создать subfeatureref в featureпапке внутри git (.git / ...), но создать папку не удалось, потому что featureуже был ref.


0

Эта проблема возникла, когда разработчик на Mac создал ветку с символом «>» в ​​имени ветви.

Это вызвало проблемы в TeamCity и на локальных компьютерах под управлением Windows, работающих под управлением SourceTree. BitBucket пропустил его без проблем.

Для разрешения пользователь удалил ветку и пересоздал ее. Что было приятно и легко.


-1

Был тот же MSG, но с каталогом, получил сбой MSG на тяге.

git --prone мне тоже не помог. Оказывается, там был файл с тем же именем, что и каталог, созданный удаленно.

Пришлось зайти в .git \ logs \ refs \ remotes \ origin и стереть файл локали - потом вытащить снова, все хорошо.

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