我有一个代码库,我想把它作为开源推到GitHub上。在这个git控制的源代码树中,我有一些包含密码的配置文件。我确保不跟踪该文件,并将其添加到.gitignore文件中。但是,我希望绝对肯定不会推送任何敏感信息,可能是在提交之间发生了一些遗漏。我怀疑我是否粗心到这样做,但我想积极一点。

有办法“grep”所有的Git吗?我知道这听起来很奇怪,但我说的“所有”是指曾经存在过的每个文件的每个版本。我想如果有一个命令,转储的diff文件每次提交,这可能工作?


当前回答

Git可以使用-S选项搜索差异(在文档中称为pickaxe)

git log -S password

这将找到添加或删除字符串password的任何提交。这里有一些选择:

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

其他回答

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

git log --patch  | less +/searching_string

or

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

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

Git可以使用-S选项搜索差异(在文档中称为pickaxe)

git log -S password

这将找到添加或删除字符串password的任何提交。这里有一些选择:

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

git rev-list --all | (
    while read revision; do
        git grep -F 'password' $revision
    done
)