-
-
Save lonnen/3101795 to your computer and use it in GitHub Desktop.
| # from i8ramin - http://getintothis.com/blog/2012/04/02/git-grep-and-blame-bash-function/ | |
| # runs git grep on a pattern, and then uses git blame to who did it | |
| ggb() { | |
| git grep -n $1 | while IFS=: read i j k; do git blame -L $j,$j $i | cat; done | |
| } | |
| # small modification for git egrep bash | |
| geb() { | |
| git grep -E -n $1 | while IFS=: read i j k; do git blame -L $j,$j $i | cat; done | |
| } |
Very nice trick, I've used it to grep and blame all occurrences of #if 0 in Godot Engine and cleanup some dead code, that's quite efficient.
I tweaked ggb() a bit to show the filename and support spaces in the argument:
ggb() { git grep -n "$1" | while IFS=: read i j k; do git blame -L $j,$j $i | cat | sed 's|^|'$i':\t|'; done; }
(I know my sed is ugly and it could likely be done more cleverly with awk or similar, but it does the trick)
what is the purpose of using cat?
Love it
A little -f makes sure the file name is always printed, and cat is not necessary:
ggb() { git grep -n "$1" | while IFS=: read i j k; do git blame -f -L $j,$j $i; done }
fish shell:
function git_grep_blame -d "git grep + git blame"
set -l IFS :
command git grep -En $argv[1] | while read -l file line code
git blame -f -L $line,$line $file | grep -E --color "$argv[1]|\$"
end
endLove the fish shell, thanks! Unfortunately, can't pass grep arguments.
I use this alias in .gitconfig:
grame = "!r() { git grep -n $1 $2 | while IFS=: read i j k; do echo $i; git blame -f -L $j,$j $i; done }; r"
(To see the filename, I added echo $i to @henrik242's command mentioned above.)
Instead of using $1 or $1 $2, why not use "$@", since all arguments seem to be used together anyway`? Or is this syntax something that exists only in some shells (e.g. Bash) but not in others?
@rafpaf What does the exclamation mark before r() in your alias do?
Combine with awk for a simple scoreboard:
geb "[[:space:]]+$" | awk '{author = $2 " " $3; lines[author] += 1 } END { for (author in lines) { printf "%s: %d\n", substr(author, 2), lines[author]}}'