如何解决 "remote rejected - failed to lock refs" 错误消息?

How to resolve "remote rejected - failed to lock refs" error message?

我是 Github 的新手,所以请多多包涵。我正在尝试将分支的新更新修改从我的本地主存储库推送到远程主存储库。它已成功提交分支但由于下面提到的错误消息而未能推送,我不确定为什么会这样,因为我以前推送分支时从未遇到过问题。我尝试了这里存在的一些解决方案,大部分都使用不同的命令行,但它们仍然不起作用。我仍在努力弄清楚问题是什么,为什么会出现这个问题以及如何解决它。

git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --set-upstream origin refs/heads/master/Homepage-2017:refs/heads/master/Homepage-2017 
Pushing to https://jdoe@stash.example.org/scm/mfb/stash-web.git
error: packfile .git/objects/pack/pack-4b09cd59c424999f5712f1ea23f3198ce0b2bfb6.pack does not match index
POST git-receive-pack (532839 bytes)
remote: error: failed to lock refs/heads/master/Homepage-2017        
To https://jdoe@stash.example.org/scm/mfb/stash-web.git
 ! [remote rejected] master/Homepage-2017 -> master/Homepage-2017 (failed to lock)
error: failed to push some refs to 'https://jdoe@stash.example.org/scm/mfb/stash-web.git'
Completed with errors, see above

TL;DR 摘要:尝试更改分支名称

名字 master/Homepage-2017 很可能是罪魁祸首。不要命名 any 分支 master/<em>anything</em>,永远:这是不明智的。

不过,似乎还有其他问题,因此您可能需要阅读其余内容。 (具体参见 "strange error" 部分。)

长详细版

首先,具体指的是帖子标题中指出的问题:除非您可以 遥控器本身上登录,然后四处看看到底是什么问题是, 可能无法修复它。但有时我们可以做出很好的猜测。

git push 视为一个合作过程,因为它是:您 运行 git push 指示 您的 Git在 Internet-phone 上调用另一个 Git。在这种情况下,您选择使用 https 协议。 (另一个主要选项是 ssh,但这不太可能产生任何真正的区别。它将使用不同的身份验证软件,但最终,运行 在另一台机器上是相同的 Git。 )

这个 https phone 调用带有一种身份验证形式——这就是这个 credential.helper 的用武之地;它的目的是让 stash.example.org 上的软件确定某人 声称 是 TheAmazingKnight 真的 你——但所有发生的事情 "outside of" 两个 Git。一旦他们在这个 Internet-phone 通话中接通,他们就会相互信任。这部分是成功的; stash.example.org 上的软件已经让你像你一样进入了,但是它会这样做(确定你的身份验证是否足够,以及 "becoming you" 在获得访问和修改文件的权限方面,如果那是stash.example.org- 上的必要性和适当性取决于他们)。

此时,您的 Git 和他们的 Git 可以通信了。您的 Git 移交了一些提交,然后向他们发送了一个请求:"I'd like you, Mr Other Git, to set your master/Homepage-2017 branch to point to commit 8bac01cafebabe0deadbeef..."(Git 向您展示的那些丑陋的大哈希 ID 之一;这是分支的提示正在推动)。然后是另一个 Git 试图锁定分支,但失败了。

事实上你自己的Git现在工作正常,故障在远程Git,是为什么:

error: failed to lock refs/heads/master/Homepage-2017

remote: 为前缀。在这里失败的不是 你的 Git,而是 stash.example.org 上的 远程 Git。如果你想确切地知道 为什么 ,你需要从他们那里获得更多信息,而现在你正在获得他们给你的一切。他们所说的不是常规 Git-to-Git phone 的一部分的所有内容都会自动调用,您的 Git 打印出来,remote: 卡在前面。没有旋钮可以让他们为您提供更多信息。

综上所述,我们可以很好地猜测为什么会失败。我不清楚的是,您首先是如何设法在自己的一端创建一个名为 master/Homepage-2017 的分支。

分支名称是分层的

分支名称,如 masterdevelopbug/123,存在于分层名称 space 中,很像文件和目录。您可以有一个名为 dir 的目录,并在该目录中存储文件 f1.txtf2.txt。您可以将 dir 的 sub-directory 命名为 d2,并在该目录中包含文件:它们的名称是 dir/d2/f3.txt 等等。

不能做的是两个一个文件dir一个目录dir。这是一个或另一个。分支名称也是如此:如果 master/ 将成为一个目录,可能包含 sub-directories,则不能有一个名为 master 分支 ].同样,如果 master 已经是分支名称,则不能有 目录 master/.

不知何故——有多种方法可以实现这一点,例如,首先重命名现有的 master,或者完全删除你自己的 master——你已经设法给自己一个 master/ 目录,你可以在其中保留一堆分支,然后在该目录中创建一个分支。但我敢打赌 他们的 Git,在 stash.example.org 之上,有一个 master 分支 。只要有这样的分支,就不能有master/目录。

(如果当 Git 遇到这些故障之一时,远程会发送一条消息解释这一点,那就太好了。毕竟,它可以看到有一个 master 分支阻止其创建 master/ 目录的能力。)

奇怪的错误

您上面的输出还包括:

error: packfile .git/objects/pack/
pack-4b09cd59c424999f5712f1ea23f3198ce0b2bfb6.pack does
not match index

(为了显示的目的,我在这里将它分成几行——最好在一行中使用精确的引号,但现在我要把它拆开,这就不那么重要了。)这个error: 不是 前缀为 remote:,所以这意味着它来自 你的 Git,当时你Git 正在收集您的提交以发送给他们的 Git。

这个意味着您的 Git 检测到您的存储库数据库中的某些文件已损坏。特别是,"does not match index" 意味着 pack-file 索引(不要与 "the" 索引混淆:Git 选择了一些非常糟糕的名字......)和 pack-file本身不同意。

也不清楚 是如何发生的,但克隆您现有的克隆可能是个好主意。这将在新克隆中生成新的包文件(和相应的新索引文件)。幸运的话,那些 new 文件将是 error-free,并且仍然包含完整 Git 存储库数据库所需的一切。然后您可以放弃损坏的克隆以支持新的 (self-healed) 克隆。然而,明智的做法是首先弄清楚为什么您自己计算机上的 on-disk 文件会损坏。 (磁盘驱动器或 SSD 坏了?将 .git 存储库存储在其他东西损坏它们的地方,例如在 Dropbox 中?坏 RAM 导致 in-memory 缓存数据损坏?所有这些事情都发生在人们身上。 "bad RAM" 案例发生在 ,这就是为什么我真的更喜欢我所有的机器都有 ECC RAM...)

我只是 运行 遇到了这样的事情,问题不在于层次结构,而在于远程目录,bugs/,例如有一个大写的 B,Bugs/。一旦我指定了远程 b运行ch 名称以反映正确的名称,我就可以开始了。我使用的 git 客户端 Sourcetree 不区分 b运行ch 名称的大小写,因此请注意这一点。