Git search repo查找所有包含字符串的文件的名称

Git search repo查找所有包含字符串的文件的名称,git,Git,我需要找到存储库中任何文件中添加或删除的特定字符串的每个实例 到目前为止我已经试过了 git log -S'string' --all git log --follow -p path/to/file git show --pretty="format:" --name-only <hash> git diff $(git log -S'string' -i --all --pretty="%H") | tee output.txt git日志-S'string'--all git

我需要找到存储库中任何文件中添加或删除的特定字符串的每个实例

到目前为止我已经试过了

git log -S'string' --all
git log --follow -p path/to/file
git show --pretty="format:" --name-only <hash>
git diff $(git log -S'string' -i --all --pretty="%H") | tee output.txt
git日志-S'string'--all
git日志--follow-p path/to/file
git show--pretty=“format:”--仅限名称
git diff$(git log-S'string'-i--all--pretty=“%H”)| tee output.txt
以各种组合

我所能得到的只是一个包含数千个文件的列表,这些文件是涉及“字符串”的提交的一部分。我需要一个列表,只列出那些在某些时候包含“string”的文件

使用git grep

git log --all --format=format:%H | xargs -n 1 git grep  -i -I --full-name "perl"
这一个将为每个提交搜索perl的出现,输出如下

c3eab7df88fdc5e848fd13fdab4298afd24f9ee8:bugzilla/bugzilla.pl:#!/usr/bin/perl

实际上可能无法解决您的问题,因为您想知道何时添加和删除它

您可以使用shell脚本迭代Git当前跟踪的所有文件,然后确定每个文件是否包含字符串:

for f in $(git ls-files); do
  commits=$(git log -S'string' --oneline -- $f | wc -l)
  if [[ $commits -gt 0 ]]; then
    echo $f
  fi
done

这不会列出任何用于包含字符串的文件,但随后已被删除。

git log-Sstring-p提供了所有输出,提取文件名非常简单:

git log -p -Sstring --all | grep '^---\|^+++' | grep -v /dev/null \
                          | sed 's%^\(---\|+++\) [ab]/%%'

+1我不知道
-p
在与
-S
组合时只输出匹配文件的补丁,非常有用@GabrielePetronella
git log
这项艰巨的工作——grep/sed看起来很复杂,但实际上很琐碎。如果有一个只列出文件名的diff选项就好了,但是我还没有找到一个可以与
git log
配合使用的选项,因为OP在这里需要它。这不是对你答案的批评,每次我意识到bash表达式会如此迅速地变得如此糟糕时,我都会感到惊讶。不过,这是一个圆滑的解决方案;)@GabrielePetronella谢谢,我并不是真的把它当作批评,我只是本着教学的精神“捍卫”了它,即传播shell编程的乐趣。:)这非常有效:
git log-p-Sstring-all | grep'^-\| ^++'| grep-v/dev/null
非常感谢:)