在Git分支名称中使用斜杠字符

193 git branch

我很确定我在一个流行的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
Run Code Online (Sandbox Code Playgroud)

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

$ git checkout -b labs/feature
Run Code Online (Sandbox Code Playgroud)

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

Von*_*onC 210

你确定分支labs还不存在(如在这个帖子中)?

您不能同时拥有文件和具有相同名称的目录.

你试图让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
Run Code Online (Sandbox Code Playgroud)

您将获得相当于"无法创建目录"的错误.
当你有一个带有斜杠的分支时,它会被存储为目录层次结构.git/refs/heads.

  • 总结答案:您可以在分支名称中包含斜杠.OP已经有一个`labs`分支,并试图创建`实验室/功能',git不愿意这样做. (18认同)
  • 感谢您的深度回复.. Interstingly我尝试了git branch foo/bar(有效); 然后git branch -d foo/bar,但我看到foo /目录(现在为空)仍然存在!编辑:一旦我做"git branch foo"就会被替换.一切都很好. (3认同)

Jak*_*ski 97

可以使用分层分支名称(带有斜杠的分支名称).例如,在我的存储库中,我有这样的分支.需要注意的是,您不能在存储库中同时拥有分支'foo'和分支'foo/bar'.

您的问题不在于使用名称中的斜杠创建分支.

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

上面的错误消息是关于'labs/feature'分支,而不是'foo/bar'(除非它是copy'n'paste中的错误,即你编辑了部分会话).什么是结果git branch还是git rev-parse --symbolic-full-name HEAD

  • 谢谢,抱歉造成了困惑,我首先写了一个 foo/bar 示例,但粘贴了我实际测试中的错误消息。不会再这样做了:)也为我的错误感到抱歉,事实上我已经有一个“实验室”分支了。 (2认同)

小智 31

如果您已经拥有基本名称的分支,则有时会出现此问题.

我试过这个:

git checkout -b features/aName origin/features/aName
Run Code Online (Sandbox Code Playgroud)

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

删除分支features解决了问题,上面的命令工作.


flo*_*ori 29

在我的情况下,我忘了已经有一个未使用的labs分支.删除它解决了问题:

git branch -d labs
git checkout -b labs/feature
Run Code Online (Sandbox Code Playgroud)

说明:

每个名称只能是父分支普通分支,而不是两者.这就是为什么树枝labs ,并 labs/feature在同一时间不能都存在.

出现这种情况的原因是分支存储在文件系统中,您也不能在同一级别拥有文件labs和目录labs.