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=now
和git 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 ref
unable 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 错误(无法更新本地参考)的主要内容,如果未能解决你的问题,请参考以下文章
IDEA中使用Git拉取代码时报 Git pull failed原因及处理方法