From: Michael Haggerty <mhagger@alum.mit.edu>
To: Neal Kreitzinger <nkreitzinger@gmail.com>
Cc: Leonardo Kim <dalinaum@gmail.com>, git@vger.kernel.org
Subject: Re: Branch names with slashes
Date: Thu, 15 Dec 2011 23:41:00 +0100 [thread overview]
Message-ID: <4EEA777C.6040607@alum.mit.edu> (raw)
In-Reply-To: <4EEA5B55.1040405@gmail.com>
On 12/15/2011 09:40 PM, Neal Kreitzinger wrote:
> On 12/14/2011 4:17 AM, Leonardo Kim wrote:
>> Branch names can contain slashes, so we can use 'development/foo' as
>> a branch name. If I choose 'development' as a branch name, it doesn't
>> work. There is a directory named development at '.git/refs/heads'
>> directory. So we cannot create a file named development for
>> 'refs/heads/development'.
>>
>> An error message may occurs like below. Unfortunately, It is not of
>> help to me. 'error: 'refs/heads/development/foo' exists; cannot
>> create 'refs/heads/development'.
>>
>> I think that dealing with a file system and an error message above is
>> not sufficient for a novice like me. I hope that it should be
>> improved.
>>
> FYI, We also use slashes in our branchnames to leverage some of the
> benefits of a path-like namespace like pattern matching and the logical
> expression of hierarchies using descriptive compound names. (We use git
> 1.7.1 on linux.) Here's something to keep in mind: You have to plan
> (think ahead) for your naming conventions so that the namespaces will
> maintain uniqueness at a peer level over time that cannot be confused as
> subdirs under .git/refs/heads. For example:
>
> branchnames:
> /mysystem/generic
> /mysystem/generic/project1
>
> will not work because /mysystem/generic appears to be a parent dir to
> /mysystem/generic/project1 under .git/refs/heads. The solution is:
>
> /mysystem/generic/base
> /mysystem/generic/project1
>
> these branches can coexist because they are unique without one appearing
> to be a parent dir of the other. IOW, their namespaces are peers in
> their entirety. To carry the example a little further,
>
> /mysystem/generic/project1/part2
> will not work because once again it appears to be a subdir of an
> existing branchname (ref). However,
> /mysystem/generic/project1-part2
> will work.
>
> I think the reason for this is that if you look at .git/refs/heads you
> will see that these slash delimited branch names are actually stored as
> subdirs in the filesystem sense. Therefore, git will get confused and
> error out as it tries to find branchnames that are not entirely unique
> by their full path namespace under .git/refs/heads because a branch
> namespace that is a prefix (in the filesystem sense) of another branch
> name would occupy the same path under .git/refs/heads without being
> distinguishable as unique, and vice versa.
Everything that you say is correct. And it is known, at least to a few
git implementers (i.e., not a bug but a conscious design decision). For
example, the function is_refname_available() is used explicitly to
prevent refnames that conflict in the way that you describe *even if*
the refnames in question are packed and therefore not 1:1 with
filesystem paths. This is all a limitation of the fact that references
*can* be represented by files and therefore they inherit the filesystem
constraint that a file and subdirectory within a single parent directory
cannot have the same name.
I don't believe that it would be possible to relax this limitations
without at least a little breakage of backwards compatibility.
What is the bottom line? Feel free to submit patches to improve the
documentation or error reporting. But I doubt that the underlying
limitation will be removed.
Michael
--
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/
next prev parent reply other threads:[~2011-12-15 22:41 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-14 10:17 Branch names with slashes Leonardo Kim
2011-12-14 12:52 ` Michael Haggerty
2011-12-15 20:40 ` Neal Kreitzinger
2011-12-15 22:41 ` Michael Haggerty [this message]
2011-12-16 0:10 ` Junio C Hamano
2011-12-16 7:02 ` Johannes Sixt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4EEA777C.6040607@alum.mit.edu \
--to=mhagger@alum.mit.edu \
--cc=dalinaum@gmail.com \
--cc=git@vger.kernel.org \
--cc=nkreitzinger@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.