Using the slash character in Git branch name

2019-01-01 05:38发布

问题:

I\'m pretty sure I saw somewhere in a popular Git project the branches had a pattern like \"feature/xyz\".

However when I try to create a branch with the slash character, I get an error:

$ 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

Same problem for (my initial attempt):

$ git checkout -b labs/feature

How does one create a branch in Git with the slash character?

回答1:

Are you sure branch labs does not already exist (as in this thread)?

You can\'t have both a file, and a directory with the same name.

You\'re trying to get git to do basically this:

% 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

You\'re getting the equivalent of the \"cannot create directory\" error.
When you have a branch with slashes in it, it gets stored as a directory hierarchy under .git/refs/heads.



回答2:

It is possible to have hierarchical branch names (branch names with slash). For example in my repository I have such branch(es). One caveat is that you can\'t have both branch \'foo\' and branch \'foo/bar\' in repository.

Your problem is not with creating branch with slash in name.

$ 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

The above error message talks about \'labs/feature\' branch, not \'foo/bar\' (unless it is a mistake in copy\'n\'paste, i.e you edited parts of session). What is the result of git branch or git rev-parse --symbolic-full-name HEAD?



回答3:

Sometimes that problem occurs if you already have a branch with the base name.

I tried this:

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

Unfortunately, I already had a branch named features, and I got the exception of the question asker.

Removing the branch features resolved the problem, the above command worked.



回答4:

In my case, I forgot that there was already an unused labs branch. Deleting it solved the problem:

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

Explanation:

Each name can only be a parent branch or a normal branch, not both. Thats why the branches labs and labs/feature can\'t exists both at the same time.

The reason for this behaviour is that the branches are stored in the file system and there you also can\'t have a file labs and a directory labs at the same level.



回答5:

I could be wrong, but I thought that slashes only appeared in branch names when they related to a remote repo, for example origin/master.



标签: git branch