关于github:臭名昭着的Git错误:远程被拒绝(无法锁定)

Notorious Git Error: remote rejected (failed to lock)

我正试图把我的本地分支机构推向原点。分支名称和路径相同。我推拉这根树枝已经有一段时间了,从来没有出过问题。但突然,它开始表现糟糕。上次我试图用以下命令推到原点时:

1
git push origin feature/Prizefulfilment

它给了我以下错误:

1
72c6c1da98e5cff4484e254a538d9e3b472156ff but expected 0000000000000000000000000000000000000000

我在网上搜索过,但还没有找到一个令人满意的解决办法。

我的确切错误如下:

1
2
3
4
5
6
7
8
9
10
11
$ git push origin feature/Prizefulfilment
Counting objects: 126, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (75/75), done.
Writing objects: 100% (78/78), 8.83 KiB, done.
Total 78 (delta 61), reused 0 (delta 0)
error: Ref refs/heads/feature/Prizefulfilment is at 72c6c1da98e5cff4484e254a538d9e3b472156ff but expected 0000000000000000000000000000000000000000
remote: error: failed to lock refs/heads/feature/Prizefulfilment
To [email protected]:OpusOneSCRUM
 ! [remote rejected] feature/Prizefulfilment -> feature/Prizefulfilment (failed to lock)
error: failed to push some refs to '[email protected]:OpusOneSCRUM'`

有什么想法吗?


1
 git push feature/prizeFulfilment: feature/Prizefulfilment

与此答案类似:

For the record, I believe the root cause of this problem was the difference in capitalisation between the local and remote branch names, and the case-insensitive nature of the Windows share that hosted the remote repository.

We just encountered this exact same error and were able to resolve the problem simply by renaming the local branch to match the capitalisation of the existing remote branch.

尝试并确保在本地和远程分支之间使用相同的大小写。

第二个命令使prizeFulfilment和远程prizeFulfilment之间的链接显式,这就是它工作的原因。但让一个地方分支机构保持这种差异并不是一个好的解决方案。


在区分大小写的系统上出现问题的另一个可能原因是冲突的违规名称。

如果远程存储库包含分支a/b,而您正在尝试推送分支a/b/c,那么Git将报告相同的错误(当然应该改进此错误描述)。

https://coderwall.com/p/qkofma/a-caution-about-git-branch-names-with-shttps://ocroquette.wordpress.com/2011/07/10/git-failed-to-lock/


我看到发生此错误是因为存在与新分支路径名同名的前一个分支。例子:

  • 远程HAS分支:some_feature
  • 当地有分支机构:some_feature/some_subfeature
  • 本地推分支some_feature/some_subfeature到远程
  • 远程有错误:(failed to lock)

解决:

  • 将本地分支some_feature/some_subfeature重命名为foo/some_subfeature
  • 删除远程分支some_feature

发生在我身上的事是吉特改变了我当地分支机构的资本。我有一个名为feature/blahblah的旧分支和一个名为feature/foobar的新分支。后者被自动重命名为feature/foobar,因为Git将分支存储为文件夹,我不能使用相同的文件夹名,大小写也不同。

要修复它,我必须进入.git/refs/heads并将"feature"重命名为"feature",以便所有分支都保持一致。


在我的例子中,这是权限在Git存储库中设置不正确。我在这里找到了解决方案:如何在Git存储库中正确使用组文件权限?

问题是,当创建包含路径(feature/prizefullment)的新分支时,文件夹"feature"在"refs/heads/"中创建,并且新文件夹继承了用户组ID,从而阻止未来用户使用相同的路径。

要解决这个问题,必须将setgid设置为git存储库中的所有目录,以便新文件夹继承其组ID,而不是用户的组ID。

1
2
3
chown -R git:git /path/to/repo
chmod -R g+rw /path/to/repo
find /path/to/repo -type d -print0 | xargs -0 chmod g+s

在我的情况下,我用小写字母结账。这导致远程分支和本地分支名称不一致。

远程分支是int-4368-some-feature-details,而本地分支是int-4368-some-feature-details。

为了解决这个问题,我进入了.git
efsheadsfeature并重命名了分支名称以匹配远程服务器。然后转到命令行并运行

1
git checkout INT-4368-some-feature-details


当您收到这样的消息时,首先从远程分支执行拉操作,然后执行推操作。当有人将文件推送到远程服务器时,它会将主分支(如果远程分支是主分支,它可以是任何名称)移动到其他位置。您需要在本地存储库中更新此信息,因此本地存储库中的t origin/master将向前移动。然后在本地存储库中添加文件并提交它。然后执行push操作。它对我有效。