【发布时间】:2016-03-07 11:23:34
【问题描述】:
我想使用git grep 搜索特定字符串,但我想使用git blame 过滤结果以知道我要查找的字符串已被特定人员更改。
我只是不知道如何将它们组合起来以获得我想要的结果。
感谢您的帮助。
【问题讨论】:
-
您要查找包含该字符串的当前行或更改该字符串的提交?
-
正是 git grep 的作用。
我想使用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,其作者为“Doe”且在提交内容中具有“PATTERN”。
【讨论】:
git grep 开始并使用适当的-L 选项将其转换为git annotate 可能会更好一些......也许。
这应该做你想做的。
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:%s\n' "$file" "$nr" "$line"
fi
done < <(git grep -nz "$searchstring" -- "${searchfiles[@]}")
这是否比 Jonathan.Brink 的 answer 更好/更快取决于该行的匹配量、历史记录的大小、作者的提交在历史记录中的位置、更改是否在作者的最近或最近的提交等。
使用git grep -z 来保证任意文件名的安全,使用read -d '' 来读取那些NUL 分隔的字段。
使用git annotate -L 限制需要注释的行。
输出是原始的git grep -n 输出,但仅用于作者匹配行。
【讨论】:
grep 操作变成更昂贵(并且可能更多更昂贵)的注释操作。也就是说,在这种情况下,它肯定对你很方便。如果在您关心的修订版中添加/删除了字符串,您可能能够逃脱 git log -S。