推送时Git无法解析引用

时间:2014-05-20 02:01:43

标签: git github

我遇到了Git的问题。由于未知原因,我的主分支已经被破坏了。我有一个本地提交,我想推高,但当我推,我得到这个:

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
  3. 清理了我的git存储库
  4. 尝试rm .git/refs/removes/origin/master
  5. 没有解决我的问题。有什么想法或想法吗?

9 个答案:

答案 0 :(得分:33)

(值得一试;来自@NeTeInStEiN的博士:

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

编辑:我已经在我自己的一个回购中遇到了这种行为的一部分,我可以让git在没有rm .git/refs/remotes/origin/master黑客的情况下重现错误:

  • 克隆回购
  • 删除原始主要分支(其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]


请参阅上面的评论,为了吹嘘,tl; dr是,因为这些是远程参考,git fetch完全刷新,并且因为损坏是for-each-ref和{{3无法工作,核选项rm -rf refs/remotes/origin; git fetch可以保证正确恢复遥控器。

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


答案 1 :(得分:2)

注意:使用Git 2。5(2015年7月),git for-each-ref在失败的对象"上失败时会更加精确。

commit 501cf47查看commit f551707commit 8afc493(2015年6月3日)和commit c3e23dcMichael Haggerty (mhagger)(2015年6月2日)。Junio C Hamano -- gitster --commit 9d71c5fHow to Create simple drag and Drop in angularjs中合并,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实现的代码),所以它更多   由于a,磁盘引用可能设置为此值   软件错误NULL_SHA1是实际的合法SHA-1   对象。
  因此,如果松散引用的值为NULL_SHA1,   认为它被打破了。

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

rm .git / refs / remotes / origin / master

运行git fetch --prune

答案 4 :(得分:0)

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

答案 5 :(得分:0)

  1. 只需转到该目录即可。在项目中,然后从项目中删除原始文件夹:

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

git fetch --prune

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

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

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

推送后,我切换到master并合并了“ Bar”分支而没有任何问题

答案 8 :(得分:0)

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