我用gitleaks检查我的回购记录中是否泄露了机密。当我运行以下命令并强制按下
时git filter-branch --force --index-filter \
'git rm -r --cached --ignore-unmatch terra/fixtures.go' \
--prune-empty --tag-name-filter cat -- --all
它似乎有效,除了我注意到以下内容:
WARNING: Ref 'refs/heads/automate_tests' is unchanged
WARNING: Ref 'refs/heads/ethRawTransaction' is unchanged
WARNING: Ref 'refs/heads/feature/177/leave-bastion' is unchanged
WARNING: Ref 'refs/heads/feature/FAQ' is unchanged
WARNING: Ref 'refs/heads/master' is unchanged
WARNING: Ref 'refs/heads/mjolnir' is unchanged
WARNING: Ref 'refs/heads/tmp' is unchanged
WARNING: Ref 'refs/remotes/origin/master' is unchanged
WARNING: Ref 'refs/remotes/origin/automate_tests' is unchanged
WARNING: Ref 'refs/remotes/origin/bug/0.0.11-beta-fix' is unchanged
WARNING: Ref 'refs/remotes/origin/bug/bastion-ssh' is unchanged
WARNING: Ref 'refs/remotes/origin/bug/fix-examples-merge' is unchanged
WARNING: Ref 'refs/remotes/origin/develop' is unchanged
WARNING: Ref 'refs/remotes/origin/ethRawTransaction' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/168/auto-ssh-to-bastion' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/169/ethstats_for_pantheon' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/175/ssh-to-certain-nodes' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/176/tagging-nodes-to-ips' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/177/leave-bastion' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/FAQ' is unchanged
WARNING: Ref 'refs/remotes/origin/feature/README' is unchanged
WARNING: Ref 'refs/remotes/origin/master' is unchanged
WARNING: Ref 'refs/remotes/origin/mjolnir' is unchanged
WARNING: Ref 'refs/remotes/origin/tmp' is unchanged
WARNING: Ref 'refs/tags/0.0.4' is unchanged
WARNING: Ref 'refs/tags/20190820141131-866368a' is unchanged
WARNING: Ref 'refs/tags/20190820142202-bd96767' is unchanged
WARNING: Ref 'refs/tags/20190820143451-fc7f46a' is unchanged
WARNING: Ref 'refs/tags/20190820143903-832818a' is unchanged
WARNING: Ref 'refs/tags/20190820150546-05e3105' is unchanged
WARNING: Ref 'refs/tags/20190820154631-da0cdab' is unchanged
WARNING: Ref 'refs/tags/20190820160956-047caa6' is unchanged
WARNING: Ref 'refs/tags/20190820162243-a300fa5' is unchanged
WARNING: Ref 'refs/tags/20190820170410-47f8878' is unchanged
WARNING: Ref 'refs/tags/untagged-f148f02c4d71ed0bea99' is unchanged
WARNING: Ref 'refs/tags/v.0.0.1' is unchanged
WARNING: Ref 'refs/tags/v0.0.1' is unchanged
WARNING: Ref 'refs/tags/v0.0.1-alpha' is unchanged
WARNING: Ref 'refs/tags/v0.0.10' is unchanged
WARNING: Ref 'refs/tags/v0.0.11-beta' is unchanged
WARNING: Ref 'refs/tags/v0.0.14' is unchanged
WARNING: Ref 'refs/tags/v0.0.3-alpha' is unchanged
WARNING: Ref 'refs/tags/v0.0.4-chaos-poc' is unchanged
结果,泄漏的数量似乎并没有减少。
我对为什么会发生这种情况感到困惑,不胜感激任何指针。
答案 0 :(得分:1)
git filter-branch
报告为未更改的引用在其历史记录的任何位置都没有名为terra/fixtures.go
的文件。 Filter-branch会通知您,尽管您要求它更新这些分支名称以指向任何复制的提交,但在该过程中实际上并未复制任何提交。
可能会很有趣的是找到一个确实具有此类文件的可访问提交哈希ID的列表,然后对此类哈希ID运行git branch --contains
。见下文。
请注意,这是对不同问题的不同答案。它也不是在寻找那些修改了路径名称的提交,而是在寻找那些根本存在 路径的提交。
我们首先使用git rev-list
列出所有提交:
git rev-list --all |
git rev-list
的输出仅是可从命名修订版本获得的每个提交哈希ID的列表。在这种情况下,--all
会为所有分支和标签以及其他引用(例如refs/stash
)命名,但不会命名任何引用日志条目。
然后,对于列出的每个提交,我们要测试该提交是否包含命名文件。此时,您通常需要大量的可编程性。例如,假设文件名为a/b/c.txt
。您是否还想找到A/B/C.TXT
?如果您使用的是Windows或MacOS,则可以。如果您使用的是Linux,则可能不会。或者,也许您想查找名称以某种模式开头或结尾的任何文件。
我们将在这里使用git ls-tree -r
,它列出了所有文件名,然后通过诸如grep
之类的搜索和状态命令运行它们。请注意,grep
搜索的是正则表达式,而不是全局模式,因此a*b
表示零个或多个a
字符,后跟一个b
字符,并将匹配字符串“ abc.txt”,“ b”,“ flobby”,依此类推:它们都具有零个或多个a
,后跟b
。我们将显示实际匹配的名称,以便人工在需要时可以应用进一步的过滤:
git rev-list --all |
while read hash; do
git ls-tree -r $hash > /tmp/files
if grep -s 'terra/fixtures\.go' /tmp/files; then
echo "commit ${hash} :"
grep 'terra/fixtures\.go' /tmp/files
fi
done
rm /tmp/files
这组命令的输出(您可能应该将其放在文件中,而我尚未测试过并且可能包含错误)是适合提取的提交哈希ID的列表,但后跟匹配的名称:应该放弃例如sputerra/fixtures.gobble
的匹配项。
(可以编写更精确匹配的grep
模式。在这种情况下,用^
和$
固定正则表达式就可以了。在更复杂的情况下,需要更复杂的正则表达式。我将其留给使用代码的人使用。)
已经获得了哈希ID(运行上面的命令并重定向到文件,清理文件,然后提取更有趣的哈希ID),然后您可以执行以下操作:
git branch --contains <hash>
在任何给定的提交哈希上查看哪些分支包含该特定提交。请注意,可能有零个或多个包含任何给定提交的分支。有关(更多)更多信息,请阅读并了解Think Like (a) Git。
答案 1 :(得分:0)
尝试用双引号
git filter-branch --force --index-filter \
"git rm -r --cached --ignore-unmatch 'terra/fixtures.go'" \
--prune-empty --tag-name-filter cat -- --all
答案 2 :(得分:0)
尝试改用new git filter-repo
的will replace the old git filter-branch
or BFG
git filter-repo --use-base-name --path terra/fixtures.go --invert-paths
默认情况下,此新命令可在所有分支上使用。
然后是git push --all --force
,以覆盖远程存储库的历史记录。