Git pull错误(无法更新本地引用)

我只有分支主和我得到这个错误,每次我尝试“git拉”:

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'.

我一直在寻找,却找不到原因

287466 次浏览

确保正在执行git pull的用户是创建存储库的同一用户。文件权限不正确。

如果你最近更改了密码,并且有一些奇特的东西集成了你的Windows和Linux登录,也会发生这个错误(无法更新本地ref)。

我发现同样的错误消息试图从一个比特币回购到我的lokal拷贝。也只有一个分支主,命令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再次拉没有错误

我的团队和我在SourceTree中进行拉取时遇到了这个错误,无法更新本地引用

根据下面@Edward Yang的回答,@bryan对这个答案的评论,以及这个问题/答案,你可能需要同时运行git gc --prune=nowgit remote prune origin。只运行前者对我来说一直有效,但基于ppl的回复,我认为两者都是必要的,以解决错误的不同原因。

我们使用:

git gc --prune=now

这将删除任何可以修复问题的重复引用对象。

这里有几个链接,你可以从中了解更多关于git引用和修剪的信息:

git本周提示 .

git-prune文档

git references

我的解决方法如下:

git remote prune origin

再次克隆存储库,并将.git文件夹复制到破碎的项目中。

这种情况发生在我使用不区分大小写的文件系统的OSX上。不知何故,另一个开发人员推入了一个名称相同但情况不同的分支:My-Branch vs my-branch

我已经签出了My-Branch,并在我进行拉取时得到了错误“无法更新本地ref”,这可能是因为文件系统认为My-Branch == my-branch

由于我们使用Github,我可以通过通过Github的GUI删除一个分支来解决这个问题。

我是PC用户-重启。

说实话,这对我很管用。我解决了两个奇怪的git问题,我认为这是腐败的方式。

我在我的debian服务器上也有同样的问题,因为磁盘已满。由于设备上没有剩余空间,无法创建临时文件。在清理了一些文件后,一切正常。

rm .git/refs/remotes/origin/master

这对我很管用!

试着在你的git仓库根文件夹中使用这个命令:

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

这可能是一个非常小众的情况,但是:我在我的MacBook Pro上的Parallels VM中运行Windows,我的本地回购存储在虚拟机的磁盘上,与macOS共享。

如果我在Mac应用程序中打开了一个位于Windows VM上的repo文件,我有时会得到“无法更新本地ref”错误。当这种情况发生时,解决方案是关闭文件或退出Mac应用程序。

使用gitbach line命令,使用git update-ref来更新本地分支的引用:

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

然后使用$ git pull进行拉

[locked branch name]是由于提交id不匹配而发生错误的分支的名称。

这对我很有用

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

我有同样的错误,我从Eclipse中更新,我得到了许多错误。 所以我尝试从DOS命令窗口更新,并得到了相同的问题 然后我尝试了解决方案“git gc -prune=now” 这给出了文件被锁定在refs目录的消息

Eclipse必须在"refs"目录中锁定某个内容 我找到的解决方案是关闭Eclipse。 然后我用“git PULL”命令从DOS更新了存储库,一切都工作得很好

删除文件。git/logs/refs/remotes/origin/[锁定分支名称]

这里发生了什么? 对远程分支的本地引用被改变了,因此当你运行git pull时,git找不到任何相应的远程分支,因此失败

git remote prune origin

实际上清除这个局部引用,然后再次运行git pull

建议-为了安全起见,请使用--dry-run选项运行

对我有用的是:

git config --global fetch.prune true

现在它继续运行自动修剪。

我通过删除锁定的分支文件来修复这个问题。它可能看起来很粗糙,我不知道为什么它能起作用,但它解决了我的问题(即你得到的相同错误)

< p >删除: .git/refs/remotes/origin/[locked branch name] < / p >

然后我就跑了

git fetch

git文件恢复了自己,完全修复了

我已经删除了分支的本地引用:

git branch -d -r REPO/.git/refs/remotes/origin/BRANCHNAME

然后我就可以取回了。

或者更激进一点

rm -rf REPO/.git/refs/remotes/origin

这个方法每次都有效。

问题

Windows用户经常会有这个问题

git pull

给出错误:error: cannot lock ref unable to update local ref

导致

有多个分支,其 从开头到任意斜杠(或到结尾)的名称只在大写和小写中不同。

Branch name clashing (upper/lower case)
#######################################


# Example 1)
#############################
feature/releasecandidate/fix123
feature/releaseCandidate/improveFeature789
------------------------
^
Identical from beginning up to a slash (here the 2nd one)
except for the marked letter, where the upper/lower case differs








# Example 2)
#############################
releaseBranch
releasebranch
-------------
^
Identical from beginning to the end
except for the marked letter

导致b)在linux上也是一个问题:

Prefix with slash-boundary
#######################################


# Example 1) - also a problem on linux
#############################
feature/release2021
feature/release2021/fixIssue07
^
slash boundary


# Example 2)
#############################
feature/release2022
feature/Release2022/fixIssue99
^          ^
differing case   slash boundary
(problem on
windows)

解决方案

删除原因(具体参见上面的导致)。

# inspect your branches, to see if you have the upper/lower case problem
git ls-remote --heads YOUR-GIT-URL

例如:创建一个分支命名策略,例如全部用小写字母;或者最后一个斜杠前面的字母小写。或者一些智能钩子,可以检测到违规。(但是注意:在原因a)中,问题只在windows上,而不是linux上)。

背景

问题是windows将这些分支(来自示例1和2)存储在.git文件夹中

# inspect the files/folders under
.git/refs/remotes/origin/

导致)中的窗口不能区分 大写和小写的区别,所以git在window上发疯了

导致b)中,文件夹(例如feature/release2021/)不能与文件(feature/release2021)同名。

解决方案

一个短期的解决办法通常是有效的(直到你消除了原因):

git pack-refs --all


# delete the contents of .git/refs/remotes/origin/*
rm -rf .git/refs/remotes/origin/*


git pull; git pull; git pull   # all good? yes!

一个命令解决方案[Linux/bash用户]

  1. 通过更改文件的所有权来更改权限。

sudo chown username -R .git

(将“username”替换为您的用户名)

如果文件的所有者是sudo,则使用sudo。

  1. 删除文件也可以解决这个问题。

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

这对Windows来说已经足够了:

Git包引用——全部

<标题> < / h1 >直接回答

git remote prune origin
rm .git/refs/remotes/origin/master
git fetch
git pull origin master

按步骤执行上述命令

git pull origin <branch_name_you_are_currently_at>将只拉动该分支。 它可能会给您带来合并冲突,也可能不会。解决问题并承诺。

打开Git Bash为admin cd到文件夹, Git添加。 Git commit -m "your message" Git推 他现在要么使用内置凭证,要么要求用户名/pw, 如果内置凭据或用户名/pw不起作用,创建一个PAT并关闭要求凭据的窗口,将弹出一个屏幕,要求PAT

我有同样的错误,我从git桌面应用程序拉。所以我尝试从DOS命令窗口更新,并得到相同的问题。

然后我尝试了解决方案"Git gc -prune=now " . 解决Git Desktop面临的问题 < / p >

Git gc -prune=现在:这已经解决了我所面临的上述问题。 Git Issue < / p >

谢谢。

这对我来说非常合适:

rm -rf .git/packed-refs .git/rr-cache