【问题标题】:Git error on git pull (unable to update local ref)git pull 上的 Git 错误(无法更新本地参考)
【发布时间】: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将此添加为选择它的答案

标签: git command-line-interface


【解决方案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 stackoverflow.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'.

解决方法如下

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

【讨论】:

    【解决方案7】:

    问题

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

    git pull 
    

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

    原因

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

    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/
    

    并且在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 用户]

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

                    sudo chown username -R .git

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

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

                    1. 删除文件也能解决问题。

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

                    【讨论】:

                      猜你喜欢
                      • 2012-08-01
                      • 2010-11-17
                      • 2015-03-07
                      • 2011-03-01
                      • 2016-09-06
                      • 2014-11-23
                      • 2012-05-11
                      • 1970-01-01
                      • 2010-11-12
                      相关资源
                      最近更新 更多