【问题标题】:Notorious Git Error: remote rejected (failed to lock)臭名昭著的 Git 错误:远程被拒绝(无法锁定)
【发布时间】:2012-09-07 03:41:27
【问题描述】:

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

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'`

有什么想法吗?

【问题讨论】:

  • 您可能希望在本地和远程运行 git fsck 以确保没有严重损坏。
  • 它在我的本地 Checking object directories: 100% (256/256), done. Checking objects: 100% (106152/106152), done. dangling blob 4118c6392bbea95a6404d40344e12ff8fe1e64c8 dangling blob a34f2078115375df3749567e01793e556f0e5ade dangling blob 9a5e545d9056200834f74d6426144269974467a0 dangling blob 867c5821823a875e724203b5bc8bbf65c8b72931 dangling blob 128ccc6d40e4090cd725d37867308e525825b991 dangling blob 5b91603a188d5f13af4ef56b0f62d6d8caff92b4 dangling blob c6a5241f7a4c23a68456526adf94f3c784d1df69 上返回了一些悬空提交,还有更多悬空提交
  • 我随后使用了 git prune,它删除了很多悬空 Blob,但一些悬空提交仍然存在......
  • 我更新了我的问题以包含有关错误的更多详细信息。
  • 好的。新的更新。出于某种原因,git push origin feature/PrizeFulfilment 给了我错误,但是当我执行 git push feature/prizeFulfilment: feature/PrizeFulfilment 时,它起作用了......不知道它是怎么回事和为什么。只是明确地告诉它要寻找哪个分支似乎工作正常。

标签: git github


【解决方案1】:
 git push feature/prizeFulfilment: feature/Prizefulfilment

类似于this answer:

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

我们刚刚遇到了同样的错误,只需重命名本地分支以匹配现有远程分支的大小写即可解决问题。

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

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

【讨论】:

  • 确保大小写相同解决了我的问题。
【解决方案2】:

发生在我身上的是 git 正在改变我本地分支的大小写。我有一个名为 Feature/blahBlah 的旧分支和一个名为 feature/fooBar 的新分支。后者自动重命名为 Feature/fooBar 因为 git 将分支存储为文件夹,并且我不能使用不同大小写的相同文件夹名称。

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

【讨论】:

    【解决方案3】:

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

    如果远程仓库包含分支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/

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        在我的例子中,我结帐了一个全小写字母的分支。这导致远程分支和本地分支名称不一致。

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

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

        git checkout INT-4368-some-feature-details
        

        【讨论】:

          【解决方案6】:

          我看到这个错误的发生是因为以前的分支与我的新分支路径名称同名。示例:

          • 远程有分支:some_feature
          • 本地有分公司:some_feature/some_subfeature
          • 本地将分支some_feature/some_subfeature 推送到远程
          • 远程有错误:(failed to lock)

          解决方案:

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

          【讨论】:

            【解决方案7】:

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

            问题是当创建一个包含路径(功能/Prizefulfilment)的新分支时,在“refs/heads/”中创建文件夹“feature”,并且新文件夹继承了阻止未来用户的用户组 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
            

            【讨论】:

              【解决方案8】:

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

              git branch -m new-name
              

              【讨论】:

                猜你喜欢
                • 2011-04-14
                • 1970-01-01
                • 2015-03-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-01-08
                • 2012-11-18
                相关资源
                最近更新 更多