-
-
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
end
Love 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]}}'