git describe and "the smallest number of commits possible"
- Date: Sat, 26 Aug 2017 16:47:17 +0200
- From: Kévin Le Gouguec <kevin.legouguec@xxxxxxxxx>
- Subject: git describe and "the smallest number of commits possible"
I've asked this question on the git-users Google Groups list, and
while the answers there were interesting, I still cannot figure
whether my problem comes from an actual bug, a misleading manpage, my
inability to understand the code and/or the manpage, or a combination
of the three.
I noticed this problem on 2.1.4 (Debian oldstable); I can reproduce it
on next (7ef03bb281b2220d0f2414365e4949beb2337042). Quoting
git-describe(1)'s SEARCH STRATEGY section:
> If multiple tags were found during the walk then the tag which has
> the fewest commits different from the input commit-ish will be
> selected and output. Here fewest commits different is defined as the
> number of commits which would be shown by `git log tag..input` will
> be the smallest number of commits possible.
To put it shortly, after cloning GNU Emacs's repository:
$ git describe --tags
$ git log --oneline emacs-25.1.. | wc -l
$ git log --oneline emacs-25.2.. | wc -l
If I am reading it correctly, the manpage suggests that emacs-25.2
should be picked in this situation ("log emacs-25.2.." shows fewer
commits than "log emacs-25.1..").
Once more with --debug:
$ git describe --debug --tags
searching to describe HEAD
lightweight 129847 emacs-25.1
lightweight 4086 emacs-25.1-rc2
lightweight 4126 emacs-25.1-rc1
annotated 4185 emacs-25.2
annotated 4220 emacs-25.2-rc2
lightweight 4226 emacs-25.0.95
annotated 4236 emacs-25.2-rc1
annotated 4280 emacs-25.1.91
lightweight 4305 emacs-25.0.94
lightweight 4329 emacs-25.1.90
traversed 130257 commits
more than 10 tags found; listed 10 most recent
gave up search at 5c587fdff164e8b90beb47f6da64b4884290e40a
I tried to get a sense of what builtin/describe.c is doing (see 
for some debug printfs); to summarize what I figured:
- When QSORT() is called in describe(), emacs-25.1's depth is smaller
- finish_depth_computation() updates the best candidate's depth; AFAIU
this update's only purpose is to make the displayed suffix more
That is all I have right now. I apologize for failing to come up with
a simpler test case (I tried to make toy repositories with a similar
topology to reproduce the issue, to no avail). To conclude, as far as
I can tell, one of the following holds:
- something about this repository causes git-describe(1) to not
work as advertised;
- I fail at reading manuals.
: The project's workflow sounds straightforward:
- development happens mainly on the master branch;
- the emacs-25 branch receives maintenance fixes and release tags; it
is periodically merged back into master;
- experimental work can happen on scratch branches; these may
eventually be merged back into master.
There are some complications (e.g. pull-induced merges) but if
I --simplify-by-decoration I find that the repository's topology
matches this description.