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

我很确定我在一个流行的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中创建带有斜杠字符的分支?

161157 次浏览

可以使用分层分支名称(带有斜杠的分支名称)。例如,在我的存储库中,我有这样的分支。需要注意的是,你不能在存储库中同时拥有分支'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'(除非它是复制和粘贴中的错误,即你编辑了会话的部分)。git branchgit rev-parse --symbolic-full-name HEAD的结果是什么?

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

你得到的等价于“不能创建目录”;错误。
当你有一个带有斜杠的分支时,它会被存储为


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

 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存在,不能创建"”中所述:

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

这是git的内部限制。

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

我试了一下:

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

不幸的是,我已经有了一个名为features的分支,并且我得到了问题询问器的异常。

删除分支features解决了这个问题,上面的命令起作用了。

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

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

解释:

每个的名字只能是父分支是正常分支,不能两者都是。这就是为什么分支labs 而且 labs/feature不能同时存在。

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

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

在我的情况下,repo had和"以前有分支,但现在没有了,我试着创建和签出"foo/bar"从远程。 就像我说的“食物”;

?

最后,树枝"仍然在.git/config文件中,删除后一切正常:)

分支名称区分大小写,因此如果您的发布管理人员在Azure中创建了文件夹,则文件夹名称应该完全匹配。跟经理谈得很不容易。

如果有人遇到这个问题,他们无法签出到分支,例如:features/23,因为它说分支features存在,但你在Github上找不到它-可能是你有一个名为features的本地分支导致了这个问题。

git branch -D features删除本地分支,然后你应该能够用git checkout features/23签出,它应该像预期的那样工作。