在Git分支名称中使用斜杠字符
我很确定我在一个流行的Git项目中看到分支有一个类似“feature/xyz”的模式 但是,当我尝试创建带有斜杠字符的分支时,出现了一个错误:在Git分支名称中使用斜杠字符,git,branch,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 相同的问题(我最初的尝试): 如何在Git
$ 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中创建带有斜杠字符的分支?我可能错了,但我认为斜杠只出现在分支名称中,当它们与远程回购相关时,例如
origin/master
可能有层次化的分支名称(带有斜杠的分支名称)。例如,在我的存储库中,我有这样的分支。需要注意的是,存储库中不能同时包含分支“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
$git分行foo/bar
错误:无法解析引用引用/heads/labs/feature:不是目录
致命:无法锁定更新的引用:不是目录
上面的错误消息讨论的是“实验室/功能”分支,而不是“foo/bar”(除非复制粘贴中出现错误,即您编辑了部分会话)。
git branch
或git rev parse——符号全名头的结果是什么?您确定branchlabs
不存在(如中所示)
文件和目录不能同时具有相同的名称。
您试图让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下的目录层次结构
如果已经有一个具有基名称的分支,则有时会出现此问题
我试过这个:
git checkout -b features/aName origin/features/aName
不幸的是,我已经有了一个名为features
的分支,我得到了一个问题询问者的例外
删除分支功能
解决了问题,上面的命令起作用。我忘了我已经有一个未使用的实验室
分支。删除它解决了我的问题:
git branch -d labs
git checkout -b labs/feature
说明:
每个名称只能是父分支或普通分支,不能同时是两者。这就是为什么分支labs
和
不能同时存在的原因
原因是:分支存储在文件系统中,在那里您也不能有文件labs
和目录labs
处于同一级别。只是有同样的问题,但我再也找不到冲突的分支
在我的例子中,回购协议以前有“foo”分支,但现在没有了,我尝试从远程创建并签出“foo/bar”。
正如我所说,“foo”已经不存在了,但这个问题依然存在
最后,分支“foo”仍然在.git/config文件中,删除后一切正常:)实际上,您的头似乎有问题。看起来git认为你的头
是指向尚未创建的分支实验室/功能
的链接。我不知道这是怎么发生的,但这意味着你试图基于它创建一个名为foo/bar
的分支,但它不起作用。你知道你的头是怎么掉下来的吗?我很抱歉搞混了,它是“实验室/功能”,不是“foo/bar”,编辑的example.FWIW斜杠之前的任何内容都将在.git/refs/heads
下生成一个目录,即如果执行git checkout-b feature/123
操作,则在projectRootFolder/.git/refs/heads
目录中,您将看到名为feature
的目录,在该目录中,您将看到名为123
。稍后,如果您创建另一个feature/124
,那么在feature
目录中,您将看到一个名为124
的分支,创建名称中带有“/”的本地分支是完全可能的,而且确实很常见。这是在“名称空间”中对相关分支进行分组的一种常见方法。是的,老实说,在学习时可能会混淆,但命名也很有用。然后再次使用斜杠或破折号,我不确定这是否超出个人喜好?git flow使用这种名称空间:)感谢您的深入回复。。有趣的是,我尝试了git branch foo/bar(有效);然后git branch-dfoo/bar,但是我看到foo/目录(现在为空)仍然存在!编辑:我一做“git branch foo”它就被替换了。一切都很好。@faB:邪恶。。。但并非意外:您删除了bar(在'foo
'名称空间中),但没有删除foo
(可以作为其他分支的名称空间,也可以作为分支本身)。这并不重要,但git即使在调用pack refs
时也不会改变其立场,因此,它会特意保护您不受此影响。总结一下答案:您可以在分支名称中使用斜杠。OP已经有了一个labs
分支,并试图创建labs/feature
,git对此犹豫不决。谢谢,很抱歉造成混淆,我首先编写了一个foo/bar示例,但粘贴了实际测试中的错误消息。不会再这样做了:)我也为我的错误感到抱歉,事实上我已经有了一个“实验室”分支。这正是我想要的!谢谢
git branch -d labs
git checkout -b labs/feature