我遇到了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
我在其他主板上看到了这个问题,但通常是指拉动而不是推动。尽管如此,我已经尝试过他们的解决方案,但无济于事:
git gc --prune=now
rm .git/refs/removes/origin/master
没有解决我的问题。有什么想法或想法吗?
答案 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
。
然而,谷歌搜索推送消息确实让我这样:
请参阅上面的评论,为了吹嘘,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 f551707,commit 8afc493(2015年6月3日)和commit c3e23dc,Michael Haggerty (mhagger
)(2015年6月2日)。Junio C Hamano -- gitster
--。
(commit 9d71c5f在How 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)
.git/refs/remotes/origin
git fetch --prune
或者您可以使用此git fetch --all
获取所有分支。
现在push
或pull
与您的代码一起使用,
这对我有用,
答案 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 并更新文件的内容。这为我解决了这个问题。