描述:
这次被第三方扫到有资安问题,此项目已有几千次commit,发现第435次被员工上传敏感资料 + 几次commit message也有问题
个人知识:
我个人只会覆盖最新一笔的救援方式,想不到如何无害解决此问题
能想到解决方式:
最差情况可能需要狠下心全部git重来,但之后无法再查之前 history
描述:
这次被第三方扫到有资安问题,此项目已有几千次commit,发现第435次被员工上传敏感资料 + 几次commit message也有问题
个人知识:
我个人只会覆盖最新一笔的救援方式,想不到如何无害解决此问题
能想到解决方式:
最差情况可能需要狠下心全部git重来,但之后无法再查之前 history
GitHub 上的项目记录(commit history)是公开和不可变的,一旦提交到仓库,就无法直接删除。这是因为 Git 的设计哲学之一就是保持数据的完整性和可追溯性。
然而,有几种方法可以处理你所描述的问题:
使用 git-filter-branch
或 BFG Repo-Cleaner
来重写历史
你可以使用 git-filter-branch
或更现代的 BFG Repo-Cleaner
工具来重写 Git 历史。这些工具允许你删除或修改特定的提交,但请注意,这会改变项目的历史,可能导致与其他克隆或分支的不一致。
使用 BFG Repo-Cleaner
的例子(假设你想删除包含敏感信息的文件):
java -jar bfg.jar --delete-files your-sensitive-file.txt your-repo-dir
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push origin --force --all
在执行这些操作之前,请确保你完全理解它们的影响,并备份你的仓库。
创建一个新的分支或仓库
如果重写历史的风险太高,你可以考虑创建一个新的分支或仓库,并只包含没有问题的提交。这样,你可以保留原始仓库的历史记录,同时在新仓库中提供一个干净的版本。
修改最新的提交以修复问题
如果你只是想修复最近的几次提交(例如,修改 commit message 或回滚某个包含敏感信息的提交),你可以使用 git commit --amend
或 git revert
来实现。但这不会删除原始提交,只是添加新的提交来覆盖或撤销它们。
从记录中删除敏感信息
如果敏感信息只是存在于某个文件的某个版本中,你可以使用 git filter-branch
或 BFG Repo-Cleaner
来删除那个文件的所有历史记录,或者只删除包含敏感信息的那个版本。但同样,这会改变项目的历史。
通知相关人员
除了技术上的处理,你还需要通知所有相关人员(包括团队成员和其他可能接触到该项目的人)关于这个问题,并告知他们如何更新到修复后的版本。
防止类似问题再次发生
最后,确保建立和维护良好的安全实践和代码审查流程,以防止类似的问题再次发生。
请注意,直接修改或删除 Git 历史记录可能会带来风险,特别是在与其他开发者或系统集成的情况下。在执行任何操作之前,请确保你完全理解这些风险,并考虑与团队或组织中的其他成员进行沟通。
2 回答1.3k 阅读✓ 已解决
3 回答1.8k 阅读
2 回答1.2k 阅读
1 回答1.2k 阅读
2 回答982 阅读
1 回答740 阅读
787 阅读
上传的敏感资料是否有多次变更?
commit 435
的时候提交了,可以在435
之后创建一个分支,把对应的敏感文件目录添加到.gitignore
中,把敏感目录移出项目目录,然后把.gitignore
的修改和敏感文件目录的remove
记录提交。最后把主线分支rebase
到你创建的新分支上面。最后再用rebase
把新的 Commit 用squash
合并到commit 435
中。这样敏感文件的commit历史就没有了。如果你的敏感文件有很多次修改。那么Git的推荐修改方式是使用 git-filter-repo
至于Commit Message 你直接在
rebase
的过程中选择对应的提交记录把标识从pick
改成edit
就可以修改了。在操作的过程中 Git 会在终端提示你如何操作。最后完成之后需要
git push -f
强制推送到远端。所以你如果不是特别熟悉rebase
的话,最好把原始分支做一个备份再进行rebase
(默认你不知道怎么找已经被drop
掉的提交记录hash
值)