Re: git log filtering
- From
Linus Torvalds <torvalds@linux-foundation.org>
- Date
- Feb 7, 2007, 17:12 UTC
- Message-ID
- <Pine.LNX.4.64.0702070856190.8424@woody.linux-foundation.org>
- In-Reply-To
- <68948ca0702070841m76817d9el7ce2ec69835c50e@mail.gmail.com>
On Wed, 7 Feb 2007, Don Zickus wrote:
Show 10 quoted lines
> > I was curious to know what is the easiest way to filter info inside a > commit message. > > For example say I wanted to find out what patches Joe User has > submitted to the git project. > I know I can do something like ' git log |grep -B2 "^Author: Joe User" > ' and it will output the matches and the commit id. However, if I > wanted to filter on something like "Signed-off-by: Joe User", then it > is a little harder to dig for the commit id.
There are two ways:
- "git log" can itself do a lot of filtering. Both on date, on revisions, on "modifies files/directories X, Y and Z" _and_ on strings.
See "man git-rev-list" for more (it doesn't apply to just "git log", it applies to just about any revision listing, including gitk etc)
For example,
git log [--author=pattern] [--committer=pattern] [--grep=pattern]
will likely do exactly what you want. You can do
git log --grep="Signed-off-by:.*akpm"
on the kernel archive to see which ones were signed off by Andrew.
So the above works, and catches *most* uses. But it has problems if you want to do something fancier (and I think that includes something as simple as doing a case-insensitive grep). So the other approach is:
- The hacky way: use "git log --pretty -z", and GNU grep -z:
git log --pretty -z | grep -i -z Signed-off-by:.*junkio | tr '\0' '\n'
which allows you to do anything you want with grep (or other unix tools that take zero-terminated output).
> Is there a better way of doing this? Or should I accept the fact that > git wasn't designed to filter info like this very quickly?
Git definitely was designed to do it. The "-z" option in particular is very much designed for any generic UNIX scripting, but the *easy* cases git does internally.
Linus