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

3

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?

Stagehand answered 19/9, 2016 at 20:4 Comment(0)
W
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.

Werra answered 20/9, 2016 at 0:28 Comment(1)
Perhaps ack would be a better alias name for this.Impearl
S
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.

Stagehand answered 19/9, 2016 at 20:4 Comment(0)
B
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.)

Borodin answered 26/5, 2020 at 8:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.