Search all of Git history for a string?
我有一个代码库,我想把它作为开放源代码推送到Github。在这个Git控制的源代码树中,我有一些包含密码的配置文件。我确保不跟踪这个文件,并将其添加到.gitignore文件中。然而,我要绝对肯定的是,不会推送任何敏感的信息,可能是在提交或某些内容之间有什么遗漏。我怀疑我不够粗心,不能这么做,但我想保持积极的态度。
有没有办法"grep"所有的git?我知道这听起来很奇怪,但是"全部"的意思是所有文件的每一个版本。我想,如果有一个命令为每次提交都转储diff文件,那么这可能有效吗?
- 它的局限性在于只搜索一个分支(master?)但是它非常接近你想要的github.com/divity76/searchgithubhistory.js/blob/master/…。/
- 尽管有"正确答案",但您的要求是检查某些信息是否公开提交——"git"答案仅与您提交整个历史相关。当然,如果您只提交当前的修订版,而没有历史记录(例如"git archive"),那么一个简单的"grep"就足够了。
- 不是复制品。另一个问题是关于日志,这一个是关于所有Git历史的。这些是不同的。
Git可以使用-s选项搜索diff(在文档中称为pickaxe)
号
这将找到添加或删除字符串password的任何提交。这里有几个选项:
- -p:将显示差异。如果您提供一个文件(-p file文件),它将为您生成一个补丁。
- -G:查找添加或删除的行与给定regexp匹配的差异,而不是-S,后者"查找引入或删除字符串实例的差异"。
- --all:搜索所有分支和标签;或者,使用--branches[=]或--tags[=]。
- 如果有什么事情最终被提交,有没有一个简单的方法来删除它?让我们假设在这个场景中有一个我想要保留的配置文件,但是有一行包含一个密码,我想从我的所有Git历史中删除这个密码。有没有什么简单的方法可以在不重写每个提交的情况下做到这一点?
- @是的,江户十一〔四〕会成功的。相关问题:stackoverflow.com/questions/4963261/can-i-rebase-old-commits
- 嗨,git log -Gpassword --all,如何添加只搜索某些文件的条件(提供一个regex来过滤文件名+文件路径)
- @mattd"不重写每个提交"-不。在引入密码之后,必须重新编写每个提交。此工具是清理repo的最简单方法:rtyley.github.io/bfg-repo-cleaner
- 在这个特殊的例子中,我还添加了一个-i,以使搜索不区分大小写。
- 注意,-S和password之间没有空间。我看到过其他建议,包括一个空间,包括一个将导致一个fatal: ambiguous argument。
- 只是提醒一下,上面的命令对我来说不太管用。我做了以下的事情:git log -p -S 我从这篇关于git pickaxe的信息性文章中窃取了这个信息。
- 由geoffrey hale回滚编辑,-S选项执行搜索差异。在-S后面加上空格,将参数的含义从搜索项改为"修订或路径"。
- 我不知道这是否是新的,但是链接的文档说-S查找"改变指定字符串出现次数的差异"(强调已添加)。因此,如果一个commit添加了您要查找的术语,但也从其他地方删除了它,-S将找不到它。以东十一〔15〕阿突不这样做。
- 谢谢!因为这是一个非常有用的参考,我想补充一下,-- path/filename将把搜索限制在一个文件中。
1 2 3 4 5
| git rev-list --all | (
while read revision; do
git grep -F 'password' $revision
done
) |
- +1:我本来会"在‘Git Rev List--All’;Do Git Grep…Done’中修改的",但是你的方法更容易反应,因为它会在找到修改的时候变好。
- 是否可以在远程存储库(如GitHub)上使用它?
- @里斯:当然,只有克隆了它。
- 为了避免看到vendor/cache/和public/assets/的匹配,将此答案中的grep行改为:git grep -F 'password' $revision | grep -v ':vendor/cache/' | grep -v ':public/assets/'。
尝试以下命令搜索所有以前跟踪的文件中的字符串:
1
| git log --patch | less +/searching_string |
或
1
| git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string' |
。
它需要从您要进行搜索的父目录中运行。