搜索所有Git历史记录中的字符串?


Search all of Git history for a string?

本问题已经有最佳答案,请猛点这里访问。

我有一个代码库,我想把它作为开放源代码推送到Github。在这个Git控制的源代码树中,我有一些包含密码的配置文件。我确保不跟踪这个文件,并将其添加到.gitignore文件中。然而,我要绝对肯定的是,不会推送任何敏感的信息,可能是在提交或某些内容之间有什么遗漏。我怀疑我不够粗心,不能这么做,但我想保持积极的态度。

有没有办法"grep"所有的git?我知道这听起来很奇怪,但是"全部"的意思是所有文件的每一个版本。我想,如果有一个命令为每次提交都转储diff文件,那么这可能有效吗?


Git可以使用-s选项搜索diff(在文档中称为pickaxe)

1
git log -Spassword

这将找到添加或删除字符串password的任何提交。这里有几个选项:

  • -p:将显示差异。如果您提供一个文件(-p file文件),它将为您生成一个补丁。
  • -G:查找添加或删除的行与给定regexp匹配的差异,而不是-S,后者"查找引入或删除字符串实例的差异"。
  • --all:搜索所有分支和标签;或者,使用--branches[=]--tags[=]


1
2
3
4
5
git rev-list --all | (
    while read revision; do
        git grep -F 'password' $revision
    done
)


尝试以下命令搜索所有以前跟踪的文件中的字符串:

1
git log --patch  | less +/searching_string

1
git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'

它需要从您要进行搜索的父目录中运行。