4

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

到目前为止我已经尝试过

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

在各种组合中。

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

4

3 回答 3

4

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

git log -p -Sstring --all | grep '^---\|^+++' | grep -v /dev/null \
                          | sed 's%^\(---\|+++\) [ab]/%%'
于 2013-06-27T14:58:04.847 回答
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

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

于 2013-06-27T14:58:01.353 回答
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

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

于 2013-06-27T14:56:35.707 回答