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

在所有Git历史记录中搜索字符串?,git,Git,我有一个代码库,我想把它作为开源推送到GitHub。在这个git控制的源代码树中,我有一些包含密码的配置文件。我确保不跟踪此文件,并将其添加到.gitignore文件中。但是,我想绝对肯定的是,不会推送任何敏感信息,可能是在提交或其他操作之间发生了某些事情。我怀疑我做这件事不够粗心,但我要乐观 有没有办法“grep”整个git?我知道这听起来很奇怪,但我所说的“全部”是指曾经存在的每个文件的每个版本。我想如果有一个命令可以在每次提交时转储diff文件,这可能会起作用?Git可以使用-S选项搜索d

我有一个代码库,我想把它作为开源推送到GitHub。在这个git控制的源代码树中,我有一些包含密码的配置文件。我确保不跟踪此文件,并将其添加到
.gitignore
文件中。但是,我想绝对肯定的是,不会推送任何敏感信息,可能是在提交或其他操作之间发生了某些事情。我怀疑我做这件事不够粗心,但我要乐观


有没有办法“grep”整个git?我知道这听起来很奇怪,但我所说的“全部”是指曾经存在的每个文件的每个版本。我想如果有一个命令可以在每次提交时转储diff文件,这可能会起作用?

Git可以使用-S选项搜索diff(称为pickaxe)

git rev-list --all | (
    while read revision; do
        git grep -F 'password' $revision
    done
)
这将查找添加或删除字符串
密码的任何提交。以下是一些选项:

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

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

git log --patch  | less +/searching_string


它需要从父目录运行,在父目录中进行搜索。

+1:我会在`git rev list--all`;do git grep…done`中执行“for revision”,但您的方法更具反应性,因为在查找修订时它会变灰。是否可以在远程存储库(如github)上使用此方法?@reesd:当然,只有在克隆它的情况下才可以。为了避免看到来自
vendor/cache/
public/assets/
的匹配项,请将此答案中的
grep
行更改为:
git grep-F'password'$revision | grep-v':vendor/cache/''grep-v':public/assets/'
,如果确实发生了什么事情,有没有一种简单的方法可以移除它?让我们假设在这个场景中,有一个配置文件我想保留,但其中一行包含一个密码,我想从所有git历史记录中删除它。有没有简单的方法可以在不重写每个提交的情况下执行此操作?在这种情况下,我还会加入一个
-I
,以使搜索不区分大小写。仅供参考,上面的命令对我来说并不起作用。我做了以下操作:
git log-p-S
我从我不知道这是否是新的,但是链接的文档说,
-S
查找“改变指定字符串出现次数的差异”(强调添加)。因此,如果提交添加了您正在查找的术语,但也从其他地方删除了它,
-S
将找不到它<代码>-G
,OTOH,不能这样做。谢谢!因为这是一个非常有用的参考,我想补充一点,
--path/filename
将搜索限制为一个文件。它的局限性在于它只搜索一个分支(主分支?),但它非常接近您想要的/尽管“答案正确”,您的要求是检查某些信息是否未公开提交——“git”答案仅与您提交整个历史记录相关。当然,如果您只提交当前版本,而没有历史记录(例如使用“git归档”),那么简单的“grep”就足够了,而不是重复。另一个问题是关于日志,这是关于所有git历史的问题。这些是不同的。
git log --patch  | less +/searching_string
git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'