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

Jor*_*eña 704 git

我有一个代码库,我想将其作为开源推送到GitHub.在这个git控制的源代码树中,我有一些包含密码的配置文件.我确保不跟踪此文件,我也将其添加到.gitignore文件中.但是,我希望绝对肯定的是,没有任何敏感信息会被推送,也许是因为某些事情在提交之间滑落了.我怀疑我做得不够粗心,但我想要积极.

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

Nat*_*ger 1091

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

git log -Spassword
Run Code Online (Sandbox Code Playgroud)

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

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

  • 在这种特殊情况下,我还会抛出一个`-i`来使搜索大小写不敏感. (6认同)
  • 我不知道这是否是新的,但链接的文档说`-S`查找"改变**指定字符串的出现次数**的差异"(强调添加.)因此,如果提交添加了你正在寻找的术语,但也从其他地方删除它,`-S`将找不到它.`-G`,OTOH,不这样做. (6认同)
  • 谢谢!因为这是一个有用的参考,所以我将添加`-path / filename`将搜索限制为文件。 (5认同)
  • 仅仅是一个FYI,上面的命令对我来说并没有真正起作用.我做了以下内容:`git log -p -S <YOUR_SEARCH_TERM>`我从[这篇关于git pickaxe的内容丰富的文章中窃取了这些信息.](http://www.philandstuff.com/2014/02/09/git-pickaxe的.html) (4认同)
  • 如果事情最终结束,是否有一种简单的方法可以删除它?我们假设在这种情况下有一个我想保留的配置文件,但是一行包含一个密码,我想从我的所有git历史中删除它.没有重写每次提交的任何简单方法吗? (3认同)
  • @MattD是的,`git rebase -i <commit>`会做的.相关问题:http://stackoverflow.com/questions/4963261/can-i-rebase-old-commits (2认同)
  • 嗨,`git log -Gpassword --all`,如何添加条件以仅搜索某些文件(提供正则表达式来过滤文件名+文件路径) (2认同)
  • 回滚了 Geoffrey Hale 的编辑 `-S` 选项会搜索差异。在`-S` 后添加空格会将参数的含义从搜索词更改为“修订版或路径”。 (2认同)

cdh*_*wie 84

git rev-list --all | (
    while read revision; do
        git grep -F 'password' $revision
    done
)
Run Code Online (Sandbox Code Playgroud)

  • +1:我本来会做"修改\`git rev-list --all \`; do git grep ... done",但是你的方法更具反应性,因为它在找到修订版时会发出反应. (10认同)
  • 是否可以在远程存储库(如 github)上使用它? (2认同)
  • @reesd:当然只有克隆了。 (2认同)

ken*_*orb 35

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

git log --patch  | less +/searching_string
Run Code Online (Sandbox Code Playgroud)

要么

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'
Run Code Online (Sandbox Code Playgroud)

需要从您要进行搜索的父目录运行.