From: Linus Torvalds Date: Sat, 22 Oct 2005 01:26:27 GMT Subject: Re: git-rev-list: add "--dense" flag Message-ID: In-Reply-To: <20051022003733.GA8351@pasky.or.cz> On Sat, 22 Oct 2005, Petr Baudis wrote: > > There is no documentation for the --dense flag and it is even missing > from the usage string. I'm not much for docs ;) The whole path argument also isn't even there (and without paths, --dense doesn't matter) > But my main concern is - will it be possible to do the rename detection > here as well? Yes. Note that git-rev-list doesn't actually _do_ the diff, it only checks whether the tree is changed. You still just get a list of commits out of it, and it is up to you to decide what to do with it. If you're just going to feed them to diff-tree _anyway_, then you might as well not even do the dense thing, because quite frankly, you're just doing extra work. But let's say that you want to follow a certain filename, what you can do is basically (fake shell syntax with "goto restart") rev=HEAD restart: git-rev-list $rev --dense --parents -- "$filename" | while read commit parent1 restofparents do if [ "$restofparents" ]; then .. it's a merge, do whatever it is you do with merges .. else shaold=$(git-ls-tree $parent -- "$filename") shanew=$(git-ls-tree $commit -- "$filename") # Did it disappear? # Maybe it got renamed from something if [ -z "$shaold" ]; then old=$(git-diff-tree -M -r $commit | grep " R .* $filename") echo "rename? $old" filename=figure-it-out-from-$old rev=$parent goto restart fi git-diff-tree -p $commit -- "$filename" fi while or something similar. In other words: you'll basically have to figure out the renames on your own, and follow the renaming, but something like the above should do it. Linus