【问题标题】:Using the slash character in Git branch name在 Git 分支名称中使用斜杠字符
【发布时间】:2011-02-01 09:51:58
【问题描述】:

我很确定我在一个流行的 Git 项目中的某个地方看到了分支具有类似“feature/xyz”的模式。

但是,当我尝试使用斜线字符创建分支时,出现错误:

$ git branch labs/feature
error: unable to resolve reference refs/heads/labs/feature: Not a directory
fatal: Failed to lock ref for update: Not a directory

同样的问题(我最初的尝试):

$ git checkout -b labs/feature

如何在 Git 中使用斜杠创建分支?

【问题讨论】:

  • 实际上,您的HEAD 似乎有问题。看起来 git 认为您的 HEAD 是指向尚未创建的分支 labs/feature 的链接。我不知道这是怎么发生的,但这意味着您尝试基于它创建一个名为foo/bar 的分支,它不起作用。知道你的HEAD 是怎么解开的吗?
  • 我很抱歉造成混淆,它的“实​​验室/功能”,而不是“foo/bar”,已编辑示例。
  • FWIW 斜线之前的任何内容都将在.git/refs/heads 下生成一个目录,即如果您执行git checkout -b feature/123,那么在您的projectRootFolder/.git/refs/heads 目录中您将看到一个名为:feature 的目录在该目录中的位置你会看到一个名为123 的分支。稍后,如果您创建另一个 feature/124 然后在 feature 目录中,您将看到一个名为 124 的分支

标签: git branch


【解决方案1】:

您确定分支labs 不存在(如this thread)?

您不能同时拥有同名的文件和目录。

你试图让 git 基本上这样做:

% cd .git/refs/heads
% ls -l
total 0
-rw-rw-r-- 1 jhe jhe 41 2009-11-14 23:51 labs
-rw-rw-r-- 1 jhe jhe 41 2009-11-14 23:51 master
% mkdir labs
mkdir: cannot create directory 'labs': File exists

您会遇到“无法创建目录”错误。
当你有一个带有斜杠的分支时,它会被存储为 .git/refs/heads 下的目录层次结构。


注意labs 不能是现有的分支,正如ddruganovthe comments 中指出的那样:

 git switch -c 19023-commerce/19033-commerce-view 19023-commerce

 # Fails with:

 fatal: cannot lock ref 'refs/heads/19073-commerce-view/99999-test-branch': 
 'refs/heads/19073-commerce-view' exists; 
  cannot create 'refs/heads/19073-commerce-view/99999-test-branch'

如“git push: refs/heads/my/subbranch exists, cannot create”中所述:

  • 如果分支 b 存在,则无法创建名为 b/anything 的分支。
  • 同样,如果分支 dev/b 存在,则无法创建 dev/b/c。

这是一个 git 内部限制。

【讨论】:

  • 感谢您的深入回复。有趣的是,我尝试了 git branch foo/bar (有效);然后 git branch -d foo/bar,但我看到 foo/ 目录(现在为空)仍然存在!编辑:一旦我执行“git branch foo”,它就会被替换。一切都很好。
  • @faB: wicked... 但并不意外:你删除了 bar (在 'foo' 命名空间中),但没有删除 foo (它可以作为其他分支的命名空间或被一个分支本身)
  • 这并不重要,但即使你调用pack-refs,git 也不会改变它的立场,所以它会竭尽全力保护你免受这种影响。
  • 总结答案:您可以在分支名称中使用斜杠。 OP 已经有一个 labs 分支并试图创建 labs/feature,但 git 拒绝了。
  • @duozmo 那么解决方案是什么?我如何指定我从某个特定的参考分支分支?
【解决方案2】:

可以有分层分支名称(带有斜线的分支名称)。例如,在我的存储库中,我有这样的分支。一个警告是,您不能在存储库中同时拥有分支“foo”和分支“foo/bar”。

您的问题不在于创建名称中带有斜线的分支。

$ git 分支 foo/bar 错误:无法解析参考 refs/heads/labs/feature:不是目录 致命:无法锁定参考以进行更新:不是目录

上面的错误信息是关于“labs/feature”分支,而不是“foo/bar”(除非它是复制“n”粘贴中的错误,即您编辑了会话的一部分)。 git branchgit rev-parse --symbolic-full-name HEAD 的结果是什么?

【讨论】:

  • 谢谢,对混乱感到抱歉,我首先写了一个 foo/bar 示例,但粘贴了我实际测试中的错误消息。不会再这样做了 :) 也为我的错误感到抱歉,确实我已经有一个“实验室”分支了。
【解决方案3】:

我忘记了我已经有一个未使用的labs 分支。删除它解决了我的问题:

git branch -d labs
git checkout -b labs/feature

说明:

每个名称只能是父分支普通分支,不能同时是两者。这就是为什么分支labs labs/feature 不能同时存在的原因。

原因:分支存储在文件系统中,你也不能有一个文件labs和一个目录labs在同一级别。

【讨论】:

  • 正是我想要的!谢谢
【解决方案4】:

如果您已经有一个具有基本名称的分支,有时会出现该问题。

我试过了:

git checkout -b features/aName origin/features/aName

不幸的是,我已经有一个名为features 的分支,并且我得到了提问者的例外。

删除分支features 解决了问题,上述命令有效。

【讨论】:

    【解决方案5】:

    分支名称区分大小写,因此如果发布管理器在 Azure 中创建了文件夹,则文件夹名称应完全匹配。学会了与经理一起提高它的艰辛。

    【讨论】:

      【解决方案6】:

      刚刚遇到同样的问题,但我再也找不到冲突的分支了。

      在我的情况下,repo 之前有和“foo”分支,但现在没有了,我尝试从远程创建和签出“foo/bar”。 正如我所说的“foo”不再存在,但问题仍然存在。

      最后,分支“foo”还在.git/config文件中,删除后一切正常:)

      【讨论】:

        【解决方案7】:

        如果有人遇到无法结帐到分支的问题,例如:features/23,因为它说分支 features 存在,但您在 Github 上找不到 - 可能是您有导致它的名为 features 的本地分支。

        使用git branch -D features 删除本地分支,然后您应该可以使用git checkout features/23 结帐,它应该可以按预期工作。

        【讨论】:

          猜你喜欢
          • 2016-01-29
          • 2016-12-11
          • 2017-09-12
          • 1970-01-01
          • 2021-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-01
          相关资源
          最近更新 更多