git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [feature request] git: tags instead of commit IDs in blame output

From
Jean Delvare <khali@linux-fr.org>
Date
Aug 25, 2010, 07:32 UTC
Message-ID
<20100825093237.6fec9c5d@hyperion.delvare>
In-Reply-To
<201008241653.50225.johan@herland.net>
Hi Johan,
On Tue, 24 Aug 2010 16:53:49 +0200, Johan Herland wrote:
Show 30 quoted lines
> On Tuesday 24 August 2010, Jean Delvare wrote:
> > On Sat, 21 Aug 2010 12:10:22 +0200, Johan Herland wrote:
> > > To me, it seems what you want to do is convert the commit ID in
> > > front of every blame-line into the result of running 'git name-rev'
> > > (or 'git describe') on that line.
> > >
> > > To that effect something like this should work:
> > >
> > >   git blame <file> |
> > >   while read sha1 rest
> > >   do
> > >       tag=$(git name-rev --tags --name-only $sha1) &&
> > >       echo "$tag $rest"
> > >   done
> > >
> > > Of course, if you're doing this at a bigger scale, you want to wrap
> > > this in a script that (1) caches commitID -> tag mappings, and that
> > > (2) runs 'git name-rev in its --stdin mode'.
> >
> > Thanks for the very valuable suggestion. Obviously, the fact that the
> > above command took over an hour to complete on a 1000-line file as
> > kind of an issue ;) I did suspect this performance issue originally,
> > which is why I thought it would be better if git itself would
> > implement the feature.
> 
> Yes, everything would be easier and faster if git itself implemented it. 
> Aka. infinite feature creep... This obviously does not scale.
> 
> Instead, Git tries to provide the building blocks that you can string 
> together to produce the exact result you're looking for.
Yes, I get the idea now, it makes a lot of sense.
Show 22 quoted lines
> > That being said... git name-rev's --stdin 
> > option seems to be doing all the hard caching work already:
> >
> > git blame -l <file> | git name-rev --tags --name-only --stdin
> >
> > does almost what I want, and is reasonably fast (13 seconds for the
> > same file.)
> 
> I did the same experiment on a much larger file (~19000 lines), and got:
> 
>   27.94s git blame -l <file>
> 
>   28.31s git blame -l <file> | git name-rev --tags --name-only --stdin
> 
> which suggests that the git name-rev process only adds ~1% to the total 
> runtime.
> 
> > I'll need to do some reformatting work to extract the tag 
> > from the symbolic names (which in turn should almost fix the
> > alignment),
> 
> ...only if all the tag names happen to have the same length.

Exactly. Which is the case for me at the moment, and if it ever changes, I'll deal with it. I guess a simple printf will do.

Show 6 quoted lines
> > but this is nothing a few lines of shell scripting can't do.
> 
> I don't see why you need to remove the suffix from the tag name. You're 
> simply removing information that could be used to look up the exact 
> commit resposible for each line. And it's not like the tag name is 
> completely unreadable unless you remove the suffix...

I'm not claiming that my approach is the universal solution to anything. It's just what I need in specific cases, and what my old tool was doing. If my needs evolve in the future, maybe I'll stop stripping the extra information. But for the time being, I value conciseness over completeness.

And for the interested, if any, here's the small script I came up with:
#!/bin/sh
if [ -z "$1" ]
then
	echo "File?"
	exit 1
fi
# Replace commit IDs with symbolic names, then strip symbolic names
# to tags, and finally strip the -rc part of tags.
git blame -l "$1" | \
	git name-rev --tags --name-only --stdin | \
	sed -e 's/^\([^~ ]*\)~[^ ]*/\1/' -e 's/^\([^ ]*\)-rc[0-9][0-9]*/\1/'
-- 
Jean Delvare
Previous: Johan Herland
Message 5 of 5 in “[feature request] git: tags instead of commit IDs in blame output”
  1. Jean DelvareAug 21, 2010
  2. Johan HerlandAug 21, 2010
  3. Jean DelvareAug 24, 2010
  4. Johan HerlandAug 24, 2010
  5. Jean DelvareAug 25, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.