gitgrepack

How do you make `git grep` output look like `ack` output?


I've recently found git grep and come to like its speed and de facto searching of only the files in the repo. But coming from ack (ack-grep in Ubuntu), one thing left to be desired is the output formatting, which is unfortunately much more like grep than ack. Go figure.

ack:

  1. Prints the matching filename on the first line by itself.
  2. Color highlights the matching filename a bold green.
  3. Prints the line number, and only the line number, with each matching line.
  4. Color highlights the line number a bold yellow.
  5. Color highlights each matching string a background yellow.
  6. Prints a blank line between matches from different files.

On the other hand, git grep:

Is there any set of git grep options, or combo with other tools, that can make git grep output look like ack output?


Solution

  • You've already answered part of your own question (--break inserts a blank line between files, --heading prints the file name separately, and -n or --line-number gives you line numbers on each line).

    The rest is just color options, which are set in git config via the color.grep.<slot> entries. See the documentation for full details, but note that based on what you asked for, I think this does the trick:

    [alias]
        ack = -c color.grep.linenumber=\"bold yellow\" \
              -c color.grep.filename=\"bold green\" \
              -c color.grep.match=\"reverse yellow\" \
              grep --break --heading --line-number
    

    (this is expressed as you'd see it in git config --global --edit since the quoting is messy).

    Or, to set it up in one command:

    git config --global alias.ack '-c color.grep.linenumber="bold yellow"
        -c color.grep.filename="bold green"
        -c color.grep.match="reverse yellow"
        grep --break --heading --line-number'
    

    Add or subtract -c options to change whatever colors you like, and/or set them to your preferred defaults by setting color.grep.<name> = color instead of using the git ack alias.