8

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:

  • Prints the filename on every matching line.
  • Prints no line number.
  • Prints no blank line between matches from different files.
  • Color highlights only the matching text, a bold red.

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

CivFan
  • 13,560
  • 9
  • 41
  • 58

3 Answers3

13

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.

CivFan
  • 13,560
  • 9
  • 41
  • 58
torek
  • 448,244
  • 59
  • 642
  • 775
5

From Travis Jeffery, to group git grep output like ack:

git config --global alias.g "grep --break --heading --line-number"

And then use git g like you would git grep:

git g <search_string>

This is not a complete match to ack output -- it's missing the color highlighting -- but for a quick solution it's ok.

CivFan
  • 13,560
  • 9
  • 41
  • 58
1

With this patch applied, almost everything can be done with Git configuration:

git config --global color.grep.linenumber "bold yellow"
git config --global color.grep.filename "bold green"
git config --global color.grep.match "reverse yellow"
git config --global grep.linenumber true
git config --global grep.heading true

(The missing bit is a configuration option for --break.)

emersion
  • 393
  • 4
  • 10