Re: [Feature Request] git blame showing only revisions from git rev-list --first-parent
From: Jeff King <hidden>
Date: 2016-06-15 23:06:30
Subsystem:
the rest · Maintainer:
Linus Torvalds
On Fri, Sep 11, 2015 at 11:47:30AM +0100, Stephen Connolly wrote:
A command line option to `git blame HEAD -- path` that instructs that
the revisions of blame be the revisions where the change was applied
to the current branch not the revision where the change first
originated (i.e. limit commits to `git rev-list --first-parent HEAD`)
I can get what I want with the following:
git rev-list --first-parent HEAD | awk '{print p " " $0}{p=$0}' >
tmpfile && git blame -b -S tmpfile HEAD -- path && rm tmpfile
But that is a rather ugly command. Could we have something built in to
git blame to make this much easier for users?I agree this would be a useful feature. Though blame takes rev-list options, it doesn't use the stock rev-list traversal internally, so it has to handle first-parent itself. I'm not too familiar with the code, but this _seems_ to work for me:
diff --git a/builtin/blame.c b/builtin/blame.c
index 21321be..2e03d47 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c@@ -1375,6 +1375,10 @@ static struct commit_list *first_scapegoat(struct rev_info *revs, struct commit static int num_scapegoats(struct rev_info *revs, struct commit *commit) { struct commit_list *l = first_scapegoat(revs, commit); + if (!l) + return 0; + if (revs->first_parent_only) + return 1; return commit_list_count(l); }
I suspect it doesn't work at all with `--reverse`. I also have the nagging feeling that this could be handled inside revision.c with parent-rewriting, but I don't really know. But "git blame --first-parent <file>" seems to behave sanely in git.git with this. -Peff