【问题标题】:Git unable to resolve references when pushing推送时Git无法解析引用
【发布时间】:2014-07-08 03:07:06
【问题描述】:

我在使用 Git 时遇到问题。由于未知原因,我的 master 分支不知何故损坏了。我有一个本地提交,我想推送,但是当我推送时,我得到了这个:

git push origin master
error: unable to resolve reference refs/remotes/origin/master: No such file or directory
error: cannot lock the ref 'refs/remotes/origin/master'.
Everything up-to-date

我在其他板上看到过这个问题,但通常指的是拉而不是推。尽管如此,我已经尝试了他们的解决方案,但无济于事:

  1. 尝试修改我当前的提交并推送
  2. git gc --prune=now清理了我的git仓库
  3. 试过rm .git/refs/removes/origin/master

没有人能解决我的问题。有什么想法或想法吗?

【问题讨论】:

  • git for-each-ref '**/master' 说什么?具体来说,我怀疑你有一个refs/heads/refs/remotes/origin/master
  • 上面写着fatal: missing object 0000000000000000000000000 for refs/remotes/origin/master
  • git for-each-ref 说什么?
  • 我的道歉。你不知何故在那个 ref 中得到了一个全零的 sha,我只是没想到 f-e-r 会那样踢。 git update-ref -d refs/remotes/origin/master; git fetch origin.
  • 是时候变得残酷了。这些是远程参考,当您获取时它们会被刷新。 rm -rf .git/refs/remotes/origin.

标签: git github


【解决方案1】:

原始的,但唯一对我有用的解决方案:

  • 用“another name”重命名“origin”遥控器并使用它

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

在本地 repo 的基本目录中,您将找到 .git/refs/remotes/origin。在此目录中,您的分支的同名文件应包含该分支的最新提交的提交 ID(40 个字母数字字符)。如果不是这种情况,请获取分支的最后提交 ID 并更新文件的内容。这为我解决了这个问题。

【讨论】:

    【解决方案3】:

    警告:我是唯一使用该存储库的开发人员。我无法评论 这种黑客对具有更多用户/复杂性的回购的影响。请先备份所有内容。

    在尝试了这个线程和其他线程中的所有内容后,我最终从位于 \refs\heads\ 的远程服务器文件系统中删除了分支文件。我尝试按照 Prateek 的建议先从本地计算机中删除它,但没有效果。

    例如。 假设我的回购被命名为“Foo”,我的分支被命名为“Bar”。 在托管 GIT 存储库的系统上打开存储库目录 (Foo) 并导航到该文件 "Foo\refs\heads\" 然后重命名(最终删除)名为 Bar 的分支文件。

    Git 会在推送操作期间重新创建分支文件。

    push后我切换到master,合并“Bar”分支没有问题

    【讨论】:

      【解决方案4】:

      解决此问题的简单方法是首先检查您推送提交的 git 存储库是否正在更新您的提交。如果是,那么您可以删除本地计算机上的克隆存储库,然后再次克隆它。 这样错误就会消失。 为我工作!

      【讨论】:

        【解决方案5】:

        从 .git 文件夹中删除以下目录 -> .git/refs/remotes/origin

        这将删除所有远程分支,您需要使用 -> git fetch 再次获取它们。 这应该可以解决问题。

        【讨论】:

        • 这是非常危险的操作。不建议编辑 git 目录。
        • @Arci 是的,但那是唯一醒来的人
        【解决方案6】:
        1. 只需转到此目录即可。在您的项目中并从您的项目中删除源文件夹:

        .git/refs/remotes/origin
        
        1. 现在只需运行以下命令:

        git fetch --prune
        

        或者您可以使用此git fetch --all 获取所有分支。

        现在 pushpull 使用您的代码,
        这对我有用,

        【讨论】:

          【解决方案7】:

          rm .git/refs/remotes/origin/master

          运行 git fetch --prune

          【讨论】:

            【解决方案8】:

            我可能迟到了一天,还差一美元,但我最近在为学校设置第一个存储库时遇到了同样的错误消息。我看过上面的答案,但没有一个能解决我的问题。解决我的问题的是:sudo git push 并输入管理员密码...

            【讨论】:

              【解决方案9】:

              注意:在 Git 2.5(2015 年 7 月)中,git for-each-ref 在“丢失对象”失败时会更加精确。

              参见Michael Haggerty (mhagger)@commit 501cf47commit f551707(2015 年 6 月 3 日)和commit 8afc493commit c3e23dc(2015 年 6 月 2 日)。
              (由@987654328 中的Junio C Hamano -- gitster -- 合并@,2015 年 6 月 24 日)

              for-each-ref: 正确报告损坏的引用

              如果存在内容无效的松散参考文件,“git for-each-ref”会错误地将问题报告为缺失 名称为 NULL_SHA1 的对象:

              $ echo '12345678' >.git/refs/heads/nonsense
              $ git for-each-ref
              fatal: missing object 0000000000000000000000000000000000000000 for refs/heads/nonsense
              

              使用明确的“--format”字符串,它甚至可以报告 引用有效地指向 NULL_SHA1:

              $ git for-each-ref --format='%(objectname) %(refname)'
              0000000000000000000000000000000000000000 refs/heads/nonsense
              $ echo $?
              0
              

              NULL_SHA1 用于在我们的整个过程中表示“invalid object name” 代码(以及其他 git 实现的代码),所以它要多得多 可能由于磁盘引用被设置为此值 软件错误比 NULL_SHA1 是实际的合法 SHA-1
              因此,如果松散引用的值为 NULL_SHA1, 认为它已损坏。

              【讨论】:

                【解决方案10】:

                (来自@NeTeInStEiN 的一个有价值的 tl;dr:

                核选项是rm -rf .git/refs/remotes/origin,这就是这里所采用的)

                编辑:我在自己的一个存储库中遇到了这种行为的一部分,我可以让 git 在没有 rm .git/refs/remotes/origin/master hack 的情况下重现 f-e-r 故障:

                • 克隆一个仓库
                • 删除源的主分​​支(HEAD 附加到的那个)
                • 在克隆中运行git fetch --prune

                提取将产生一个悬空引用警告,git for-each-ref 将失败并显示一条熟悉的消息:

                ~/sandbox/20/buddy$ git fetch --prune
                From /home/jthill/sandbox/20/source/.
                 x [deleted]         (none)     -> origin/master
                   (refs/remotes/origin/HEAD has become dangling)
                ~/sandbox/20/buddy$ git f-e-r
                fatal: missing object 0000000000000000000000000000000000000000 for refs/remotes/origin/HEAD
                

                但这并没有破坏推送,我已经尝试了push.default的每个设置,也没有破坏git update-ref -d

                但是,谷歌搜索推送消息确实让我知道:

                I had just rebooted from a BSOD the other day [...] then git push. And that’s when I got a complaint about “Unable to resolve reference refs/remotes/origin/master…”. [...] So, I opened up the master file and it was full of spaces! Well, that’s no good. In order to fix it, I did this: [your rm, and then git fetch]


                请参阅上面的 cmets 了解详细信息,tl;dr 是,因为这些是远程 refs,git fetch 完全刷新,并且因为损坏导致 for-each-refgit update-ref 无法正常工作总之,核选rm -rf refs/remotes/origin; git fetch保证能正常恢复遥控器。

                在其他情况下,如果没有简单的方法来恢复损坏的 refs 或出于好奇,find .git/refs/remotes/origin -type f 检查锁或使用 reflogs(这些文件位于 .git/logs)来恢复内容会有所帮助,但这里没有必要。我想我错过了一个赌注,因为我没有先执行find*.lock 来自kill -9ed 早期命令的文件看起来很可能在这里,但我怀疑一个模棱两可的 ref 和 f-e-r 是我的第一步。


                【讨论】:

                • 对我来说,需要额外的rm .git/packed-refs 来解决此错误。
                • 一如既往的核选项是最好的,为我工作! :)
                猜你喜欢
                • 1970-01-01
                • 2014-11-13
                • 2017-06-24
                • 2015-09-05
                • 1970-01-01
                • 1970-01-01
                • 2016-12-27
                • 2011-03-01
                • 2018-02-12
                相关资源
                最近更新 更多