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

时间:2012-09-14 00:30:29

标签: git github

我正在尝试从我的本地到原点的分支。分支名称和路径相同。我一直在推动和拉动这个分支一段时间,从来没有遇到过问题。但突然间,它开始表现得很糟糕。上次我尝试使用以下命令推送到原点时:

git push origin feature/Prizefulfilment

它让我跟随错误:

72c6c1da98e5cff4484e254a538d9e3b472156ff but expected 0000000000000000000000000000000000000000

我已经用Google搜索过了,但还没有找到一个非常令人满意的解决方案。

我的确切错误如下:

$ 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 git@devtools.contestfactory.com:OpusOneSCRUM
 ! [remote rejected] feature/Prizefulfilment -> feature/Prizefulfilment (failed to lock)
error: failed to push some refs to 'git@devtools.contestfactory.com:OpusOneSCRUM'`

有什么想法吗?

7 个答案:

答案 0 :(得分:32)

 git push feature/prizeFulfilment: feature/Prizefulfilment

这类似于this answer

  

为了记录,我认为此问题的根本原因是本地和远程分支名称之间的大写差异,以及托管远程存储库的Windows共享的不区分大小写的特性

     

我们刚刚遇到了这个完全相同的错误,只需重新命名本地分支以匹配现有远程分支的大小写就能解决问题。

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

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

答案 1 :(得分:5)

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

如果远程存储库包含分支a/b,并且您正在尝试推送分支a/b/c,则git将报告相同的错误(绝对应该改进此错误描述)。

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

答案 2 :(得分:3)

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

  • Remote有分支:import pygal def create_chart(): gauge_chart = pygal.SolidGauge(show_legend=False, inner_radius=0.70, half_pie=False) gauge_chart.add('Max ', [{'value': 58, 'max_value': 100}]) gauge_chart.add('Min ', [{'value': 42, 'max_value': 100}]) gauge_chart.add('Mean', [{'value': 28, 'max_value': 100}]) gauge_chart.render_to_png("chart.png") if __name__ == "__main__": create_chart()
  • 本地有分支:some_feature
  • 本地将分支some_feature/some_subfeature推送到远程
  • 远程有错误:some_feature/some_subfeature

解决方案:

  • 将本地分支(failed to lock)重命名为some_feature/some_subfeature
  • 删除远程分支foo/some_subfeature

答案 3 :(得分:0)

在我的情况下,我签出了一个带有小写字母的分支。这导致远程分支和本地分支名称之间的不一致。

远程分支是INT-4368-some-feature-details,而local分支是int-4368-some-feature-details。

要修复,我进入了.git \ refs \ heads \ feature并重命名了分支名称以匹配远程。然后去了命令行并运行

git checkout INT-4368-some-feature-details

答案 4 :(得分:0)

在我的情况下,它是在git存储库中未正确设置的权限。我在这里找到了解决方案:How to use group file permissions correctly on a git repository?

问题在于创建了一个包含路径(feature / Prizefulfilment)的新分支,文件夹"功能"在" refs / heads /"中创建并且新文件夹继承了用户组ID,这阻止了将来的用户使用相同的路径。

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

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

答案 5 :(得分:-1)

当你得到这样的消息时,首先从远程分支执行pull操作。然后执行push操作。当有人将文件推送到远程服务器时,它将移动master分支(如果远程分支是master,它可以是任何名称到其他地方。你需要在本地存储库中更新它,以便本地存储库中的origin / master将继续前进。然后在本地存储库中添加文件并提交它。然后执行push操作。它对我有用< / p>

答案 6 :(得分:-1)

本地和远程仓库的分支名称在大小写上不匹配,您可以使用以下命令重命名本地分支:-

var socket = io('http://13.232.153.188:8080', {
path: '/',
transports: ['websocket'],
pingInterval: 1000,
});
var el = document.getElementById('server-time');

socket.on('broadcast', function(response) {
el.innerHTML = el.innerHTML + "</br>" + 'Server time: ' + response;
});