我想使用git grep
搜索特定的字符串,但我想通过使用git blame
过滤结果,以知道我要查找的字符串是由特定的人更改的。
我只是不知道如何将它们组合在一起才能得到我想要的结果。
谢谢你的帮助。
您可以编写一个小的shell脚本来实现这一点:
git rev-list --author=Doe HEAD |
while read rev; do
if git show -p $rev | grep "PATTERN" >/dev/null; then
echo $rev
fi
done
这将输出HEAD可以访问的SHA,这些SHA的作者为"Doe",并且提交内容中有"PATTERN"。
这应该是您想要的。
author="Some User"
searchstring=string
searchfiles=(file1 file2 file3) # Leave empty for all files.
while IFS= read -rd '' file; read -rd '' nr; read -r line; do
if git annotate -p -L "$nr,$nr" -- "$file" | grep -q "$author"; then
printf '%s:%s:%sn' "$file" "$nr" "$line"
fi
done < <(git grep -nz "$searchstring" -- "${searchfiles[@]}")
这是否比Jonathan更好/更快。Brink的答案将取决于该行的匹配量、历史的大小、作者的提交在历史中的位置、变化是在作者的最近还是不太最近的提交中,等等。
使用git grep -z
对任意文件名是安全的,使用read -d ''
读取那些由NUL
分隔的字段。
使用git annotate -L
来限制需要注释的行。
输出是原始的git grep -n
输出,但仅用于作者匹配行。