协慌网

登录 贡献 社区

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

我有一个代码库,我想将其作为开源推送到 GitHub。在这个由 git 控制的源代码树中,我有一些包含密码的配置文件。我确保不跟踪此文件,并且还将其添加到.gitignore文件中。但是,我绝对肯定不会推送任何敏感信息,也许是在提交之间有什么错位之类的话。我怀疑我是否粗心,无法做到这一点,但我想保持积极

有没有一种方法可以 “grep” 所有的 git?我知道这听起来很奇怪,但是 “全部” 是指曾经存在的每个文件的每个版本。我猜是否有一个命令可以为每次提交转储差异文件,这可能行得通吗?

答案

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

git log -Spassword

这将查找添加或删除了字符串password所有提交。这里有一些选择:

  • -p :将显示差异。如果提供文件( -p file ),它将为您生成一个补丁。
  • -G :查找添加或删除的行与给定 regexp 相匹配的差异,而不是-S ,它查找引入或删除字符串实例的差异。
  • --all :搜索所有分支和标签;或者,使用--branches[=<pattern>]--tags[=<pattern>]
git rev-list --all | (
    while read revision; do
        git grep -F 'password' $revision
    done
)

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

git log --patch  | less +/searching_string

要么

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

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