Re: check-ref-format question
- From
Daniel Barkalow <barkalow@iabervon.org>
- Date
- May 13, 2009, 15:03 UTC
- Message-ID
- <alpine.LNX.2.00.0905131051240.2147@iabervon.org>
- In-Reply-To
- <4A0AD5A2.2090103@drmicha.warpmail.net>
On Wed, 13 May 2009, Michael J Gruber wrote:
Show 35 quoted lines
> Geoff Russell venit, vidit, dixit 13.05.2009 02:09:
> > 1 $ git --version
> > git version 1.6.2.3
> > 2 $ git check-ref-format xxxx && echo OK
> > 3 $ git-check-ref-format --branch xxxx && echo OK
> > xxxx
> > OK
> > 4 $ git check-ref-format --branch xxxx && echo OK
> > usage: git check-ref-format refname
> >
> >
> > 2 seems wrong,
> > I tried 3 after looking at builtin-check-ref-format.c
> > I couldn't find any test cases in the git/t directory
> >
> > From the documenation, I expect "git check-ref-format xxx" to return 0 if xxx is
> > a valid branch or ref name. git version 1.6.3 gives the same results.
>
> There are several things going on:
>
> A) In 3 you use a different git than in 1,2,4. You told us the latter is
> 1.6.2.3, and I'm telling you the former contains v1.6.2.1-310-ga31dca0
> (which has the new --branch option).
> This simply checks whether refs/heads/xxxx is sane. (It also resolves
> @{-1} and such, which is what makes it useful at all.)
>
> B) "master" certainly looks like a valid refname, the doc seems to imply
> that it should pass the check.
>
> C) Looking at the code, check-ref-format checks explicitly for the
> presence of at least 2 levels: foo/bar is good, foo is bad. So, master
> always had been bad, as well (or bad) as full sha1s!
>
> The code has always behaved like C since its inception but I don't know
> the rationale behind the 2 level requirement. Daniel, Junio?In general, it's because you use it right before trying to use git update-ref $name, and you probably don't really want to change refs/master. Unless you know exactly what you're going (in which case, you're unlikely to check whether it's okay), you want to have a first level that specifies the type of ref and one or more additional levels that specify which ref of that type it is.
I believe that, if you've got "master", and you want to do the sensible thing with it (i.e., the file you care about is .git/refs/heads/master), you want to use rev-parse with some option or other, not check-ref-format, but I don't know the plumbing-level shell API very well.
-Daniel *This .sig left intentionally blank*