Re: how to track the history of a line in a file
On Fri, 2 Jan 2009, Jeff King wrote:
Show 10 quoted lines
> On Fri, Jan 02, 2009 at 02:13:32PM -0800, david@lang.hm wrote:
>
>> I have a need to setup a repository where I'm storing config files, and I
>> need to be able to search the history of a particular line, not just when
>> the last edit of the line was (which is what I see from git blame)
>
> As you figured out, the "manual" way is to just keep reblaming from the
> parent of each blame. Recent versions of "git gui blame" have a "reblame
> from parent" option in the context menu which makes this a lot less
> painful.
unfortunantly I am needing to do this from the command line.
Show 22 quoted lines
>> 57f8f7b6 (Linus Torvalds 2008-10-23 20:06:52 -0700 3) SUBLEVEL = 28
>>
>> what I would want it to show would be a list of the commits that have
>> changed this line.
>
> The tricky thing here is what is "this line"? Using the line number
> isn't right, since it will change based on other content coming in and
> out of the file. You can keep drilling down by reblaming parent commits,
> but remember that each time you do that you are manually looking at the
> content and saying "Oh, this is the line I am still interested in." So I
> a script would have to correlate the old version and new version of the
> line and realize how to follow the "interesting" thing.
>
> In your case, I think you want to see any commit in Makefile which
> changed a line with SUBLEVEL in it. Which is maybe easiest done as:
>
> git log -z -p Makefile |
> perl -0ne 'print if /\n[+-]SUBLEVEL/' |
> tr '\0' '\n'
>
> and is pretty fast. But obviously we're leveraging some content-specific
> knowledge about what's in the Makefile.
using the line number shouldn't be _that_ hard becouse git knows what lines came and went from the file, so it can calculate the new line number (and does with the -M option)
In my case I would consider 'the same line' to be any lines in the diff that were taken out when this line was put in
so in the usual case (for me) of
-oldline +newline
it's a 1-1 correspondence
if it's instead -oldline1 -oldline2 +newline1 +newline2
I can't know for sure which oldline corresponds to the newline, but the odds are very good that they are related, so if I widen the search to cover each of the lines I am probably good.
David Lang