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,但是没有帮助。


Answers:


929

尝试使用以下方法清理本地存储库:

$ 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
第二个命令对我有用。显然,我对刚创建的远程分支的引用有误。不知道它是如何发生的,但是很高兴这是一个简单的修复。感谢Vitek!
JGTaylor '17

1
这很好用!我也很乐意对此做些什么以及为什么起作用的解释。谢谢!
ArielSD

4
git remote prune origin命令将在我的本地工作副本上还是在远程存储库上运行?
user1438038 '18

3
@ user1438038它不应删除任何分支,而应仅更新本地工作副本中的远程引用。这里的更多信息:stackoverflow.com/questions/20106712/…–
Zengineer

606

也发生在我身上。在我的情况下,糟糕的裁判是高手,我做了以下工作:

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

这使得git恢复了ref文件。之后,一切都按预期工作。


1
我做了同样的事情,它解决了我的问题。当我在Notepad ++中打开文件时,它显然已损坏。
2013年

83
确保选择的是给您带来麻烦的文件而不是主文件
bia.migueis 2014年

6
@ bia.migueis:即使您不小心删除了master也不会损坏任何东西-下次获取时也会更新。
naught101

2
如果它是子模块,则找到引用可能会有些棘手。首先通过检查是否.git为文件夹来进行检查ls -la,请查看文件的内容.git以查找引用所在的实际.git文件夹。.git我的文件内容: gitdir: ../.git/modules/my-submodule-name
CCoder

1
在过去的一年中,我已经两次必须再次解决此问题,而这是唯一有效的修复方法。
泰德


87

对我来说,它可以删除文件夹中引发错误的文件.git/refs/remotes/origin/


做到了!但是出于好奇,您知道为什么会出现此错误吗?(一切正常,然后突然有一天出现此错误)。而且您知道删除文件是如何解决的吗?
Shreyans '16

很高兴听到这也为您修复了它。老实说,我不知道是什么导致错误出现。我的想法是文件夹中的文件之一不同步。由于我发现的其他修复均无济于事,因此我将此作为最后的手段。
Brian van Rooijen

很棒!请注意,您必须删除所有导致问题的文件(根据您得到的错误报告),就好像您只删除一个文件并尝试拉出它一样。
Rayee Roded

1
如我在回答中所述,可能的原因之一可能是系统崩溃。许多Git GUI应用程序会定期在您的存储库上运行Git(以刷新状态),如果在使用引用操作Git时系统崩溃,则最终可能会使用NULLs对其进行重写。
David FerenczyRogožan18年

53

尝试一下:

git gc --prune=now

git remote prune origin

git pull

26
尽管这可以回答作者的问题,但缺少一些解释性的文字和/或指向文档的链接。没有一些原始短语的话,原始代码片段并不是很有帮助。您可能还会发现如何写一个好的答案很有帮助。请修改您的答案。
罗伊·谢弗斯

正是这一点。仅仅纠正代码是不够的。我希望有一个解释
Musikero31年

1
git gc --prune = now在删除不必要的文件的同时更新本地存储库。对我来说很好。
Vasyl Gutnyk


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上的相同情况-发生BSOD时在git repo中工作。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为空。通过移除它解决了问题。
zinovyev '16

38

就我而言,删除目录下的所有删除参考文件后,问题就解决了.git

如果您查看该消息,它将告诉您需要删除哪些文件(特别是)。

要删除的文件位于下.git/refs/remotes

我刚刚删除了那里的所有文件,然后运行了gc prune

git gc --prune=now

之后,一切正常。


就我而言,我只是删除.git / refs / remotes,然后更新并推送服务器即可。
法拉兹·艾哈迈德

谢谢你 就我而言,我只是删除了refs / remotes / origin / feature下的文件,而我只是做了
-git

26

说明:似乎您的远程仓库(在Github / bitbucket中)分支已被删除,尽管您的本地引用未更新并且指向不存在的引用。

为了解决这个问题:

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

更多信息-来自Github文档的参考:

git- fetch-从另一个存储库下载对象和引用

--all 获取所有遥控器。

--prune 提取后,删除远程上不再存在的所有远程跟踪分支。


1
这为我工作
Onengiye理查德

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维特克米歇尔·克莱默可能你可能对你的本地和主存储库一个坏裁判。

在这种情况下,您应同时应用两个修订,而不能在两者之间拉或推。

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

对我来说,永久的解决方案只有在推/拉之前应用了两个修订之后才实现。


1
谢谢你 请注意,我用失败的分支替换了“ master”,例如-rm .git / refs / remotes / origin / develop
Damien Sawyer

1
谢谢您的回答,确实有帮助!
naffiq

1
这对我
有用

10

要在很短的时间内回答这个问题,当您的本地计算机具有有关远程服务器的某些信息,并且有人更改了某些使远程服务器的内容并且您的更改不同步时,就会出现此问题。

我遇到这个问题是因为有人删除了远程分支,并再次使用相同的名称创建了分支。

要处理此类问题,请从远程进行拉取或获取。

git remote prune origin

或者,如果您使用的是任何GUI,请从远程获取。

在此处输入图片说明



3

尝试这个:

git pull origin Branch_Name

Branch_Name,即您当前所在的分支。

如果你只做一个 git pull,则也会拉出所有其他创建的分支名称。

这就是您得到这个的原因:

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

2

对我来说,我有一个名为的本地分支,而一个名为feature/phase2的远程分支feature/phase2/data-model。命名冲突是问题的原因,所以我删除了本地分支(如果需要保留任何名称,则可以重命名)


此处存在同样的问题-我们的问题也是Mac / PC案例命名问题,因此很难发现(一个名字大写,另一个名字不大-并且它在PC上有效,但在Mac上不起作用)
rocksteady,

2

如果没有git gc --prune=now帮助您。(像我这样的倒霉)

我所做的是在本地删除该项目,然后重新克隆整个项目。


这是“我收到一条错误消息,所以我购买了一台新计算机”的方法,但我没想到会在此网站上获得任何支持。
Stephan Vierkant

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 remote set-url origin [GIT_REPO_URL]

验证远程URL:

git remote -v

现在,所有命令都应照常运行。


0

今天刚遇到问题。

故障排除方法:对于Windows Servers上的SourceTree,您可以尝试以管理员身份运行它。这解决了我在Windows Server 2012 R2域中的Atlassian源树2.1.2.5上“无法更新本地引用”的问题。

如果您也可以复制这种情况,则说明问题是由权限问题引起的。最好进行深入分析并找到根本原因-可能某些特定文件由其他用户拥有,如此-否则会有不受欢迎的副作用:在剩余的永恒时间内,您必须以SourceTree的身份运行。


好吧,我不会推荐这个。您最终将获得更多具有错误权限的文件。然后,您将需要以管理员身份运行使用存储库文件进行操作的所有内容。首先简单地修复权限不是更好吗?
David FerenczyRogožan18年

你是对的。但是只有在使其成为管理员后,我才知道这是权限问题。因此,这是我诊断过程中的一步,本身并不是一个完美的解决方案。
莱昂内·陈

当然。但是许多用户可能只是将您的答案作为解决方案,而并不真正知道后果。如果添加权限修复作为建议的解决方案,可能会更好。
David FerenczyRogožan18年

0

写下可能导致此问题的特定案例。

有一天,我在远程具有“功能”分支的同时推了一个名为“功能/子功能”的分支。

该操作正常进行,没有出现任何错误,但是当我的同事获取和/或拉出任何分支时,他们都有完全相同的错误消息unable to update local refcannot lock ref 'refs/remotes/origin/feature/subfeature

通过删除featureremote(git push --delete origin feature)上的分支,然后git remote prune origin在我的同事的仓库中运行,可以解决此问题,该消息包括* [pruned] origin/feature

因此,我的猜测是git fetch尝试subfeaturefeature内部(.git / ...)上的git文件夹中创建引用,但是创建文件夹失败是因为feature已经存在引用。


0

当Mac上的开发人员创建的分支名称中的分支符号大于“>”时,我们遇到了此问题。

这在TeamCity和运行SourceTree的基于Windows的本地计算机上引起了问题。BitBucket让它顺利通过而没有任何问题。

为了解决这个问题,用户删除了分支并重新创建了它。这很容易。


-1

具有相同的msg,但具有目录,但在拉入时出现了失败的msg。

git --prone也没有帮助我。原来有一个文件与远程创建的目录同名。

不得不去.git \ logs \ refs \ remotes \ origin并删除语言环境文件-然后再次拉,一切都很好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.