git pull 上的 Git 错误(无法更新本地参考)

Posted

技术标签:

【中文标题】git pull 上的 Git 错误(无法更新本地参考)【英文标题】:Git error on git pull (unable to update local ref) 【发布时间】:2012-04-21 13:21:12 【问题描述】:

我只有分支主控,每次我尝试“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'.

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

【问题讨论】:

本地仓库在哪里?您是否将其创建为与用于执行拉取的用户不同的用户?听起来像是文件权限问题。 是的,你说项目文件的所有者是另一个用户是对的,现在我的问题似乎很愚蠢,但你给了我答案,请把它选为最佳答案;) 请@tpg2114将此添加为选择它的答案 【参考方案1】:

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

2020 年更新: 根据下面@Edward Yang 的回答、@bryan 对此答案的评论以及this question/answer,您可能需要同时运行git gc --prune=nowgit remote prune origin。只运行前者一直对我有用,但根据 ppl 的回复,我认为两者对于解决不同的错误原因都是必要的。

我们用过:

git gc --prune=now

这将删除任何应该解决问题的重复引用对象。

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

git tip of the week

git-prune documentation

git references

【讨论】:

对我也有用,同样的消息,Windows 7 上的 Sourcetree 也刚开始遇到这个问题。非常感谢!完美运行! 可能需要这两个命令:git gc --prune=now git remote prune origin from ***.com/questions/2998832/… 我试过git remote prune origin,但它对我不起作用。但在那之后尝试了这个git gc --prune=now,它成功了!不确定,是按这个顺序需要两者,还是只需要这个。 @Skipjack 它确实暂时解决了这个问题。但是当我再次尝试获取并切换到新分支时,我得到了同样的错误。【参考方案2】:

我解决如下:

git remote prune origin

【讨论】:

尤里卡!它确实奏效了。它与重命名的远程分支或其他东西有关。我不打算解释它。 这是为我做的,git gc --prune=now 没有做任何事情 相同。这对我有用。 git gc --prune=now 对我不起作用。 这个解决方案非常有效地解决了“错误:无法锁定 ref 无法更新 localref”问题 为我工作。以前有一个 origin/release 分支,现在有人创建了一个 origin/release/feature_xxx 分支。【参考方案3】:

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

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

然后使用$ git pull拉动

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

【讨论】:

谢谢。你拯救了这一天:) 这解决了我的问题...只是一个注意:上面提到的[锁定的分支名称]是区分大小写的。阅读消息并确保使用正确的路径和名称【参考方案4】:

尝试在您的 git 存储库根文件夹中使用此命令:

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

【讨论】:

这个文件夹在 Windows 上的什么位置? 我找到了。这是您克隆到的任何目录【参考方案5】:

rm .git/refs/remotes/origin/master

对我有用!

【讨论】:

如果您在分支上,请将/master 更改为/branch_name【参考方案6】:

我在尝试从 Bitbuck Repo 提取到我的本地副本时发现了相同的错误消息。也只有一个 Branche Master 并且命令 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'.

解决方法如下

    git reflog查找最后一次提交的编号 git reset --hard <numnber> 重置为最后一次提交 git pull origin master 再拉一次没有错误

【讨论】:

【参考方案7】:

问题

Windows 用户经常会遇到这个问题

git pull 

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

原因

原因 a) 有多个分支,其 从开头到任何斜线(或到结尾)的名称,仅大小写不同

Branch name ***ing (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/

并且在Cause a)窗口无法区分 大写/小写的差异,所以 git on 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!

【讨论】:

谢谢!这是最终为我解决它的线索。我正在处理的存储库已有几年历史,两年前有人创建了一个名为“测试”的分支。上周,另一个人创建了一个名为“Test/[new branch]”的分支。 Windows 无法创建名为“Test”的目录,因为“test”分支已存在。我将 'test' 分支重命名为 Test/[something useful],问题就解决了。 谢谢,对我来说它只发生在 Windows 中【参考方案8】:

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

【讨论】:

对我来说,我不得不更改 repo 中文件的所有者,我试图用 chown 将 git pull 到正确的用户。我认为这基本上就是您所说的,尽管当我阅读此内容时对我来说并不明显。 我同意这一点,检查所有者和组是否设置为愿意拉入“.git”回购的用户(如果您将分支拉为“root”,则会发生)a“sudo chown -R”在我的情况下完成了这项工作。【参考方案9】:

这对 Windows 来说已经足够了:

git pack-refs --all

【讨论】:

为我工作! :)【参考方案10】:

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

git remote prune origin

实际上清除了这个本地引用,然后再次运行git pull

建议 - 请使用--dry-run 选项运行以确保安全

【讨论】:

【参考方案11】:

对我有用的是:

git config --global fetch.prune true

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

【讨论】:

【参考方案12】:

直接回答

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

一步一步运行上面的命令

【讨论】:

这总是对我有用。【参考方案13】:

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

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

那我就可以去取了。

或者更彻底

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

这也每次都有效。

【讨论】:

这行得通,我已经尝试了所有其他的东西,修剪它们等等......然后回到简单的步骤:(【参考方案14】:

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

【讨论】:

【参考方案15】:

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

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

【讨论】:

这正是我的情况。我在 vs-code 中打开了文件,并尝试在 Parallels VM 中使用 Visual Studio 提交。关闭 VSCode 然后执行 git pull 效果很好。感谢分享。【参考方案16】:

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

我已经检查了My-Branch,并在我执行拉取操作时收到错误“无法更新本地引用”,这可能是因为文件系统认为My-Branch == my-branch

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

【讨论】:

在我的情况下,两个冲突的分支都属于另一个用户,所以我无法删除一个。相反,我删除了 .git\refs\remotes 下的分支 ref 文件,并修复了它(暂时 - 每次我拉,直到另一个用户删除他的一个分支,问题都会回来)。 我的问题也是由于本地分支和远程具有不同的大小写。删除本地分支,使用上面的 prune 命令,然后从源检查解决它【参考方案17】:

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

【讨论】:

我怀疑这是否有帮助——甚至根本没有用。为了说服我,请添加一个解释,说明它应该如何工作以及为什么它应该有助于解决问题。突出与看似相似的现有其他答案的差异将是一个奖励。尤其是 Babak 点赞的那个。【参考方案18】:

如果您最近更改了密码并且集成了您的 Windows 和 Linux 登录名,也会发生此错误(无法更新本地引用)。

【讨论】:

【参考方案19】:

来自 PC 用户 - 重新启动。

老实说,它对我有用。我已经解决了两个奇怪的 git 问题,我认为这是通过这种方式损坏的。

【讨论】:

【参考方案20】:

我遇到了同样的错误,我是从 Eclipse 中更新的,我遇到了很多错误。 所以我尝试从 DOS 命令窗口进行更新,并遇到了同样的问题。

然后我尝试了解决方案“ git gc --prune=now ” 这给出了文件被锁定在 refs 目录中的消息。

Eclipse 一定已经锁定了“refs”目录中的某些内容。 我找到的解决方案是简单地关闭 Eclipse。 然后我使用“git PULL”命令从 DOS 更新了存储库,一切正常。

【讨论】:

【参考方案21】:

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

已删除: .git/refs/remotes/origin/[locked branch name]

然后我就跑了

git fetch

git 文件自行恢复,完全修复

【讨论】:

【参考方案22】:

git pull origin <branch_name_you_are_currently_at> 只会拉出那个分支。 它可能会或可能不会给您合并冲突。解决它们并提交它们。 它对我有用。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案23】:

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

【讨论】:

【参考方案24】:

这对我有用

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

【讨论】:

我怀疑这是否有帮助——甚至根本没有用。为了说服我,请添加一个解释,说明它应该如何工作以及为什么它应该有助于解决问题。突出与看似相似的现有其他答案的差异将是一个奖励。尤其是 Babak 点赞的那个。【参考方案25】:

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

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

sudo chown username -R .git

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

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

    删除文件也能解决问题。

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

【讨论】:

以上是关于git pull 上的 Git 错误(无法更新本地参考)的主要内容,如果未能解决你的问题,请参考以下文章

git pull拉取报错

IDEA中使用Git拉取代码时报 Git pull failed原因及处理方法

GIT入门笔记(20)- 使用eclipse 基于 git 开发过程梳理

git的pull和clone有啥区别

git 贮藏

git pull后为啥分支没有更新