【问题标题】:Git fatal: cannot lock refGit致命:无法锁定参考
【发布时间】:2017-12-21 19:27:47
【问题描述】:

我正在尝试在我的 Ubuntu 客户机上的当前分支上创建一个分支。 不幸的是,我不断收到此错误:

git checkout -b origin/feature/IF-53-change-validation-window/Tommaso
fatal: cannot lock ref 'refs/heads/origin/feature/IF-53-change-validation-window/Tommaso': 
'refs/heads/origin/branch' exists; 
cannot create 'refs/heads/origin/branch/Tommaso'

我按照此处link 的建议尝试了git gc --prune=now,但仍然出现同样的错误。

【问题讨论】:

    标签: git git-branch git-checkout


    【解决方案1】:

    您不应该检查以“origin”或任何其他现有分支名称开头的分支。

    假设分支存在于原点,您应该执行以下操作:

    git checkout feature/IF-53-change-validation-window/Tommaso
    

    如果您运行git branch,我希望您会看到名称中带有origin 的本地分支。

    git checkout X 格式是“查找本地分支 X 并检查它是否存在的简写;否则查找远程分支 X 并在本地检查 (git checkout -b X origin/X)。”

    如果您要创建新的本地分支,您通常会执行以下操作:

    git checkout -b new-branch
    

    这将创建一个新分支,指向您之前签出的同一提交。

    要修复当前状态,您可以这样做 (see here):

    git update-ref -d refs/heads/origin/branch
    

    【讨论】:

    • 谢谢!实际上,一旦我已经在分支上而不是在原点上,我就通过提供整个目录来创建分支
    • @cmbuckley 如果 [branch] 存在于 origin 为什么 op 不能只做 git fetch ; git checkout [branch]
    • 是的 - 第一个代码块是一个简单的结帐。答案的其余部分解释了 checkout 命令的不同模式,以及如何恢复和清理本地 refs。
    • 我很困惑。 OP 所做的问题是新分支的名称以“origin/”开头吗?
    • 实际问题可能是分支名称冲突(例如,仅大小写不同),以及早期手动清理的尝试。以“origin/”开头的分支命名本身并没有错,但它肯定指向对本地和远程分支的误解。
    【解决方案2】:

    如果您创建的分支的名称与 git 命名约定或项目 git 管理员设置的名称不匹配,有时会发生这种情况。将名称更改为可以解决此问题的名称。

    【讨论】:

    • 这个答案在我遇到类似问题时帮助解决了我的问题。
    • 我的问题是命名约定
    • 这对我有帮助。我重命名了分支并推送并修复了我的问题。
    【解决方案3】:

    这对我有用:

    git --no-optional-locks fetch --prune origin 
    

    【讨论】:

    • 修剪听起来很邪恶;您介意详细说明此命令的作用吗?
    • git-scm.com/docs/git-prune 从对象数据库中删除所有无法访问的对象
    【解决方案4】:

    我只是遇到了类似的问题,原因是,由于删除了 repo 上的分支,我无法将其访问到本地,所以我所做的是删除本地分支并从 repo 中拉出新分支,然后创建功能分支,它确实有效

    • 如果您删除了 repo 中的分支,它在本地仍然可用

    【讨论】:

      【解决方案5】:

      这也发生在我身上。原因是,我正在检查一个名为 feature 的分支,但在我的本地我已经有一个名为 feature/new-feature 的分支。

      【讨论】:

      • 我想用这个协议 {username}/featureName 在我的本地创建分支,但由于我的用户名对于我想要创建的所有分支都相同,所以我无法创建分支。我该怎么办?
      【解决方案6】:

      这也发生在我身上。 原因是我试图创建一个目录太深的分支。 成功创建的最深目录是: 来源/titleA/titleB/nameOfTheNewBranch 我首先尝试更深入地创建它 来源/titleA/titleB/titleC/nameOfTheNewBranch 这似乎太深了,因为它不起作用。

      【讨论】:

        【解决方案7】:

        我在这里寻找答案,但实际上我的问题更简单,但无法解决。

        • repo 的全新克隆
        • git checkout foo/bar
        • git checkout -b foo/bar/baz
        • 收到类似的错误消息。

        here, 所述,您不能将foo/bar 同时用作分支和目录。我不得不更改提议的命名约定。

        【讨论】:

        • 这是我的问题。谢谢
        【解决方案8】:

        在尝试了上述一些解决方案但没有成功后,这对我有用:

        git gc --prune=now
        

        【讨论】:

          猜你喜欢
          • 2020-09-21
          • 2018-04-23
          • 2018-04-13
          • 1970-01-01
          • 2020-12-08
          • 2021-07-23
          • 2012-10-08
          • 1970-01-01
          • 2015-03-01
          相关资源
          最近更新 更多