From: david@lang.hm Date: Fri, 02 Jan 2009 23:48:03 GMT Subject: Re: how to track the history of a line in a file Message-ID: In-Reply-To: On Fri, 2 Jan 2009, david@lang.hm wrote: > On Fri, 2 Jan 2009, Jeff King wrote: > >> 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. > > Ok, I hacked togeather a quick bash script to try this > > the problem that this has is that line 3 of $COMMIT may not be line 3 of > $COMMIT^, and if they aren't it ends up hunting down the wrong data > > either that or I am not understanding the output of git blame properly (also > very possible) I was misunderstanding git blame new script is #!/bin/bash line=`git blame -n -b -l -L /$1/,+1 -M $2` echo "-$line" foundCOMMIT=`echo "$line" |cut -c -40` foundline=`echo "$line" |cut -c 42- |cut -f 1 -d " "` while [ "$foundCOMMIT" != " " ] ;do #git diff -U0 $foundCOMMIT..$foundCOMMIT^ $2 line=`git blame -n -b -l -L $foundline,+1 -M $2 $foundCOMMIT^` echo "-$line" foundCOMMIT=`echo "$line" |cut -c -40` foundline=`echo "$line" |cut -c 42- |cut -f 1 -d " "` done this seems to be working for me now. David Lang