【问题标题】:How can I search for a string that someone changed with git?如何搜索某人用 git 更改的字符串?
【发布时间】:2016-03-07 11:23:34
【问题描述】:

我想使用git grep 搜索特定字符串,但我想使用git blame 过滤结果以知道我要查找的字符串已被特定人员更改。

我只是不知道如何将它们组合起来以获得我想要的结果。

感谢您的帮助。

【问题讨论】:

  • 您要查找包含该字符串的当前行或更改该字符串的提交?
  • 正是 git grep 的作用。

标签: git grep git-blame


【解决方案1】:

你可以写一个小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”。

【讨论】:

  • 谢谢@Jonathan.Brick 我只是想知道是否有任何方法可以在没有脚本的情况下执行此操作,我的意思是没有任何 git 命令可以用来完成此操作吗?
  • @SaulOrtega 我做了一些谷歌搜索,不幸的是我找不到...如果 git-grep 有一个 --author 选项会很好。但是,也许您可​​以将此命令包装在一个别名中,称为“grepAuthor”,这样您就可以轻松调用它而无需输入所有内容?
  • 通过从git grep 开始并使用适当的-L 选项将其转换为git annotate 可能会更好一些......也许。
【解决方案2】:

这应该做你想做的。

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
猜你喜欢
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 2020-05-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
相关资源
最近更新 更多