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


222

我很确定我在一个受欢迎的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中使用斜杠字符创建分支?

git  branch 

1
实际上,您似乎遇到了问题HEAD。看起来git认为您HEAD是指向labs/feature尚未创建的分支的链接。我不知道这是怎么发生的,但这意味着您尝试foo/bar基于它创建一个名为的分支,但没有成功。知道你怎么HEAD解脱吗?
CB Bailey 2010年

对于这种混乱,对于它的“实验室/功能”,而不是“ foo / bar”,编辑的示例,我感到抱歉。

FWIW在斜杠之前的任何内容都会在该目录下生成一个目录,.git/refs/heads即如果git checkout -b feature/123projectRootFolder/.git/refs/heads目录中然后您会在目录中看到一个名为:的目录:feature在该目录中您会看到一个名为的分支123。稍后,如果您feature/124feature目录中创建另一个目录,则会看到一个名为124
Honey

:-D“实际上,您似乎对自己的HEAD“”有疑问” @CBBailey
肯特·布尔

Answers:


222

您确定分支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

您将得到与“无法创建目录”错误等效的信息。
当分支中带有斜杠时,该分支将存储为目录层次结构.git/refs/heads


3
有趣的是,我尝试了git branch foo / bar(有效);然后git branch -d foo / bar,但是我看到foo /目录(现在为空)仍然存在!编辑:并且它被替换为我做“ git branch foo”。一切都很好。

1
@faB:恶心...但并非意外:您删除了bar(在' foo'名称空间中),但未删除foo(它可以用作其他分支的名称空间或本身就是一个分支)
VonC 2010年

这并不重要,但是git即使您打电话也不会改变其立场pack-refs,因此它正在竭尽全力保护您免受此伤害。
Josh Lee 2010年

23
总结答案:分支名称中可以有斜杠。OP已经有一个labs分支,并试图创建labs/featuregit拒绝的分支。
duozmo 2014年

107

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

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

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

上面的错误消息谈论的是'labs / feature'分支,而不是'foo / bar'(除非在复制'n'paste中是错误的,即您编辑了会话的一部分)。git branch或的结果是git rev-parse --symbolic-full-name HEAD什么?


1
谢谢,对这个混乱感到抱歉,我首先写了一个foo / bar示例,但是从我的实际测试中粘贴了错误消息。不会再做:)也很抱歉我的错误,实际上我已经有一个“实验室”分支。

33

如果您已经具有基本名称的分支,则有时会发生此问题。

我尝试了这个:

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

不幸的是,我已经有一个名为的分支features,而问题asker除外。

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


32

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

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

说明:

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

出现这种情况的原因是分支存储在文件系统中,并且那里的文件labs和目录也labs位于同一级别。


-1

我可能是错的,但是我认为斜线仅在分支名称(例如与远程仓库相关)中出现origin/master


11
创建名称中带有“ /”的本地分支是完全有可能的,而且确实很常见。这是在“命名空间”中对相关分支进行分组的常用方法。
CB Bailey 2010年

是的,说实话,在学习时可能会造成混淆,但是命名也很有用。然后再次使用斜杠或破折号,我不确定这是否超出个人喜好?

2
git flow使用这种命名空间风格:)
Rimian 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.