According to 
https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html a 
'/' is character to use in a branch name.


git imposes the following rules on how references are named:
1. They can include slash / for hierarchical (directory) grouping, but no 
slash-separated component can begin with a dot . or end with the sequence .lock.


git-flow, for example,  uses it extensively to prefix branches with 'release/', 
'bugfix/', 'hotfix/' etc.

However, I just ran into the following problem


    $git init
    Initialized empty Git repository in /home/keith/play/bug2/.git/
    $touch a
    $git add a
    $git commit -m "C1"
    [master (root-commit) d569d5b] C1
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 a
    $git checkout -b hotfix
    Switched to a new branch 'hotfix'
    $git checkout -b hotfix/b2
    error: unable to resolve reference refs/heads/hotfix/b2: Not a directory
    fatal: Failed to lock ref for update: Not a directory
    $

The problem arises when a branch already exists with a name matching the stem 
of the new branch name.

As far as I can see, this comes from the use of the branch name to create a 
directory under .git/refs/heads with the name 'hotfix/b2' because 
.git/refs/heads/hotfix already exists as a plain file.

Note, however that this works

    $git init
    Initialized empty Git repository in /home/keith/play/bug3/.git/
    $touch a
    $git add a && git commit -m 'C1'
    [master (root-commit) 304052c] C1
     1 file changed, 0 insertions(+), 0 deletions(-)
     create mode 100644 a
    $git checkout -b hotfix/b1
    Switched to a new branch 'hotfix/b1'
    $git checkout -b hotfix/b2
    Switched to a new branch 'hotfix/b2'
    $ls .git/refs/heads/ -R
    .git/refs/heads/:
    hotfix  master

    .git/refs/heads/hotfix:
    b1  b2
    $

But, for the reverse reason, I can't now create the branch named 'hotfix'

I can see the value in grouping branches in a directory tree under refs/heads, 
but wouldn't it make more sense to simply escape the '/' in the branch name so 
that 'hotfix/b1' is stored on disk as 'hotfix\/b1'?

I found this when trying to document a branching workflow for support branches. 
The repositories already had branches such as 'release1', 'release2' and I 
wanted to add branches such as 'release1/develop', 'release2/develop', 
'release1/staging', 'release2/staging' etc.

Renaming the existing published branches is not an option for us, I'm afraid.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to