【问题标题】:git pull fails "unable to resolve reference" "unable to update local ref"git pull 失败“无法解析引用”“无法更新本地引用”
【发布时间】:2011-03-01 05:47:31
【问题描述】:

使用 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,但没有用。

【问题讨论】:

标签: git git-pull


【解决方案1】:

尝试清理您的本地存储库:

$ 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>".            

【讨论】:

  • 为什么会这样?它解决了什么问题?
  • 第二个命令对我有用。显然,我对刚刚创建的远程分支的引用损坏了。不知道它是怎么发生的,但很高兴这是一个简单的修复。谢谢维泰克!
  • 这很完美!我也很想解释一下这是做什么的以及为什么会这样。谢谢!
  • git remote prune origin 命令会在我的本地工作副本还是远程存储库上运行?
  • @user1438038 它不应该删除任何分支,只更新本地工作副本中的远程引用。更多信息:stackoverflow.com/questions/20106712/…
【解决方案2】:

也发生在我身上。在我的情况下,坏的 ref 是 master,我做了以下事情:

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

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

【讨论】:

  • 我做了同样的事情,它解决了我的问题。当我在 Notepad++ 中打开文件时,它显然已损坏。
  • 确保你选择的是给你带来问题的文件而不是主文件
  • @bia.migueis:如果你不小心删除了 master 也不会损坏任何东西 - 它也会在下一次获取时更新。
  • 如果它是一个子模块,找到 ref 可能会有点棘手。首先检查.git 是否是一个文件夹,如果不是,则执行ls -la,如果不是,请查看文件.git 文件的内容以找到引用所在的实际.git 文件夹。 .git 在我的情况下文件内容:gitdir: ../.git/modules/my-submodule-name
  • 在过去的一年里,我已经两次不得不再次修复这个问题,这是唯一有效的修复方法。
【解决方案3】:

这为我完成了工作:

git gc --prune=now

【讨论】:

  • 这行得通。谢谢你拯救了我的一天! @Bernd 该命令有什么可能的解释吗?
  • git gc 文档是here
  • 也为我工作。不需要运行git remote prune origin
  • 必须在该命令运行之前将终端提到的错误引用从 .git 文件夹中移出,但在此命令运行之后,我能够愉快地继续我的编码之旅!
  • 运行这个命令在我的案例中指责了这个问题:fatal: bad object refs/remotes/origin/HEAD fatal: failed to run repack 所以我运行了rm .git/refs/remotes/origin/HEAD,后来又运行了git gc --prune=now,现在回购就像新的一样干净。
【解决方案4】:

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

【讨论】:

  • 做到了!但是出于好奇,您知道为什么会出现此错误吗? (一切正常,然后突然有一天这个错误突然出现)。还有你知道删除文件是怎么解决的吗?
  • 很高兴听到这也为您解决了问题。老实说,我不知道是什么导致了错误的出现。我的想法是文件夹中的一个文件不同步。由于我发现没有其他修复对我有用,所以我将其作为最后的手段。
  • 效果很好!请注意,您必须删除所有导致问题的文件(根据您收到的错误报告),就好像您只删除一个并尝试将其拉回来一样。
  • 可能的原因之一可能是我在my answer 中描述的系统崩溃。许多 Git GUI 应用程序会定期在您的存储库上运行 Git(以刷新状态),如果您的系统在 Git 处理引用期间崩溃,它们最终可能会被重写为 NULLs。
  • 我的系统在同步操作即将完成时崩溃了,这很有帮助。
【解决方案5】:

我只想添加一个导致 Git 引用损坏的可能原因。

可能的根本原因

在我的系统(Windows 7 64 位)上,当 BSOD 发生时,一些存储的参考文件(最有可能在 BSOD 发生时当前打开/正在写入)被覆盖带有NULL 字符(ASCII 0)。

正如其他人提到的,要修复它,只需删除那些无效的参考文件并重新获取或重新拉取存储库就足够了。

示例

错误信息:

无法锁定参考 'refs/remotes/origin/some/branch':无法解析参考 'refs/remotes/origin/some/branch':参考损坏

解决方案:

删除存储在文件%repo_root%/.git/refs/remotes/origin/some/branch中的引用refs/remotes/origin/some/branch

【讨论】:

  • 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成功。
  • 迄今为止最简单的解决方案
  • 有一个蓝屏死机。这解决了我的问题。
【解决方案6】:

试试看:

git gc --prune=now

git remote prune origin

git pull

【讨论】:

  • 虽然这可能会回答作者的问题,但它缺少一些解释性文字和/或文档链接。如果没有围绕它们的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请编辑您的答案。
  • 正是重点。仅仅纠正代码是不够的,仅此而已。我希望有一个解释
  • git gc --prune=now 更新本地存储库,同时删除不必要的文件。它对我来说很好。
【解决方案7】:

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

为了解决这个问题:

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

额外阅读-来自Github documentation的参考:

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

--全部 获取所有遥控器。

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

【讨论】:

  • 只有您的解决方案才有帮助!
【解决方案8】:

执行以下命令:

rm .git/refs/remotes/origin/master

git fetch

git branch --set-upstream-to=origin/master

以防万一,如果您需要知道什么是 .git/refs/remotes/origin/master,你会阅读 Remotes 部分 在Git References

【讨论】:

  • 你能解释一下 .git/refs/remotes/origin/branchName 是什么吗?这个解决方案对我有用
  • 这个解决方案对我有用,
【解决方案9】:

我遇到了同样的问题,并通过转到出错​​的文件来解决它:

\repo\.git\refs\remotes\origin\master

这个文件全是空值,我用 github 上的最新 ref 替换了它。

【讨论】:

  • 有同样的问题,但文件 .git/refs/remotes/origin/master 只是空的。通过删除它解决了问题。
【解决方案10】:

在我的情况下,在我删除了目录.git下的所有删除参考文件后,问题就解决了。

如果您查看该消息,它会告诉您(具体而言)需要删除哪些文件。

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

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

git gc --prune=now

之后,一切正常。

【讨论】:

  • 在我的情况下,我只是删除 .git/refs/remotes 然后更新并推送服务器并且它起作用了。
  • 谢谢尤里。就我而言,我刚刚删除了 refs/remotes/origin/feature 下的文件,我只是做了 - git pull
【解决方案11】:

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

不过,这假设有问题的分支已在远程删除。

您也可以将其添加到~/.gitconfig 以在运行git fetch 时自动修剪:

[fetch]
    prune = true

【讨论】:

  • 您的示例似乎不完整:它没有显示我可以看到的--prune。还有提示:粘贴示例后删除无用的密码提示。
  • 你说得对——我省略了 fetch 命令的输出,但我只是将其放入示例中。也感谢您提供有关删除密码提示的提示!
【解决方案12】:

如果此错误“无法更新本地引用”再次出现,即使在应用 Vojtech VitekMichel Krämer 的答案后,您也可能会遇到本地和主存储库上的错误引用。

在这种情况下,您应该同时应用两个修复程序,而不是在两者之间拉或推...

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

只有在推/拉之前应用两个修复后才能实现对我的永久解决方案。

【讨论】:

  • 谢谢。请注意,我用失败的分支替换了“master”,例如 - rm .git/refs/remotes/origin/develop
【解决方案13】:

对我来说,我是这样解决的:

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

之后我从 github 收到这条消息。

当前分行没有跟踪信息

所以接下来我要解决的问题是:

git branch --set-upstream-to=origin/master master
git pull

【讨论】:

    【解决方案14】:

    简短地回答这个问题,当您的本地人有一些关于远程的信息并且有人更改了一些导致远程的内容并且您的更改不同步时,就会出现此问题。

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

    为了处理此类问题,请从远程执行拉取或获取。

    git remote prune origin
    

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

    【讨论】:

      【解决方案15】:

      试试这个:

      git pull origin Branch_Name
      

      Branch_Name,你当前所在的分支。

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

      你得到这个的原因是:

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

      【讨论】:

        【解决方案16】:

        我可以和他一起工作

        git remote update --prune
        

        【讨论】:

          【解决方案17】:

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

          【讨论】:

          • 这里有同样的问题 - 我们的也是 Mac/PC 案例命名问题,这使得它很难发现(一个名称大写,另一个没有 - 它适用于 PC,但不适用于 Mac )
          【解决方案18】:

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

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

          【讨论】:

          • 这是一个“我收到一条错误消息,所以我买了一台新电脑”——我没想到会在这个网站上得到任何支持。
          【解决方案19】:

          我正在使用 Tower,出于某种原因,我的文件夹名称为 .git/refs/remotes/origin/Github。将其更改为小写.git/refs/remotes/origin/github 解决了这个问题。

          【讨论】:

            【解决方案20】:

            我有同样的问题。我遵循以下步骤

            1)将有问题的分支切换到其他分支

            2) 删除那个分支

            3) 再次结帐。

            注意:- 您可以隐藏未提交的更改并将其重新放回。

            【讨论】:

              【解决方案21】:

              我使用了git prune origin 并且成功了。

              【讨论】:

                【解决方案22】:

                写下可能导致此问题的具体案例。

                有一天我推送了一个名为“feature/subfeature”的分支,同时在远程有“feature”分支。

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

                通过删除远程 (git push --delete origin feature) 上的 feature 分支,然后在我同事的 repo 上运行 git remote prune origin 解决了这个问题,生成的消息包括 * [pruned] origin/feature

                所以,我的猜测是 git fetch 试图在 git 内部(.git/...)上的 feature 文件夹中创建 subfeature 引用,但创建文件夹失败,因为已经有 feature 引用。

                【讨论】:

                  【解决方案23】:

                  我在作曲家更新时遇到了同样的问题。但对我来说,它只有在我清除作曲家缓存并删除供应商文件夹的内容后才有效:

                  rm -rf vendor/*
                  git gc --prune=now
                  git pull
                  composer clear-cache
                  composer update my/package
                  

                  【讨论】:

                    【解决方案24】:

                    尝试从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 删除第四行即可解决问题。

                    【讨论】:

                      【解决方案25】:

                      我在使用 SourceTree 时遇到了这个问题。我试着再拉一次,它奏效了。我想我是巫术分支(结帐)太快了:)。

                      我的情况与发帖者的情况有点不同,因为我的存储库相对合作,没有任何明显的损坏。

                      【讨论】:

                        【解决方案26】:

                        有相同的味精,但有一个目录,在拉取时收到一个失败的味精。

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

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

                        【讨论】:

                          【解决方案27】:
                           # 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
                          

                          【讨论】:

                            【解决方案28】:

                            在删除并使用相同名称创建存储库时面临同样的问题。只有当我像下面这样重新设置远程 url 时它才有效;

                            git 远程 set-url 来源 [GIT_REPO_URL]

                            验证远程网址:

                            git remote -v
                            

                            现在,所有命令都应该照常工作了。

                            【讨论】:

                              【解决方案29】:

                              今天刚遇到问题。

                              故障排除方法: 在 Windows 服务器上使用 SourceTree,您可以尝试以管理员身份运行它。这解决了我在域中 Windows Server 2012 R2 上 Atlassian Source Tree 2.1.2.5 上“无法更新本地参考”的问题。

                              如果你也可以复制这种情况,则证明问题是由权限问题引起的。最好深入挖掘并找到根本原因 - 可能某些特定文件由其他用户拥有等 - 否则会有一个不受欢迎的副作用:您将不得不以管理员身份运行 SourceTree 直到永远。

                              【讨论】:

                              • 好吧,我不推荐这个。您最终会得到更多权限不正确的文件。您将需要以管理员身份运行所有使用存储库文件进行操作的东西。首先简单地修复权限不是更好吗?
                              • 你是对的。但只有在以管理员身份工作后,我才发现这是权限问题。所以这是我诊断过程中的一个步骤,本身并不是一个完美的解决方案。
                              • 当然。但是许多用户可能只是将您的答案作为解决方案而没有真正知道后果。如果您将权限修复添加为建议的解决方案,可能会更好。
                              【解决方案30】:

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

                              这导致 TeamCity 和运行 SourceTree 的本地 Windows 计算机出现问题。 BitBucket 让它顺利通过。

                              为了解决用户删除了分支并重新创建它。这很简单。

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 2012-09-18
                                • 2014-07-08
                                • 2012-04-21
                                • 2016-12-27
                                • 1970-01-01
                                • 2016-05-07
                                • 2017-06-24
                                • 1970-01-01
                                相关资源
                                最近更新 更多