Git搜索仓库获取包含字符串的所有文件的名称

时间:2013-06-27 14:40:41

标签: 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

各种组合。

我能得到的是一份包含数千个文件的列表,这些文件属于提交的一部分&#39;字符串&#39;。我需要一个仅列出那些在某些时候包含&#39; string&#39;的文件的列表。

3 个答案:

答案 0 :(得分:4)

git log -Sstring -p提供所有输出,并且很容易提取文件名:

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

答案 1 :(得分:0)

使用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

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

答案 2 :(得分:0)

您可以使用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

这不会列出任何曾经包含该字符串但随后被删除的文件。