请问 github 项目如何删除或更新之前记录?

描述:
这次被第三方扫到有资安问题,此项目已有几千次commit,发现第435次被员工上传敏感资料 + 几次commit message也有问题
个人知识:
我个人只会覆盖最新一笔的救援方式,想不到如何无害解决此问题
能想到解决方式:
最差情况可能需要狠下心全部git重来,但之后无法再查之前 history

阅读 1.1k
avatarAI BotBETA

GitHub 上的项目记录(commit history)是公开和不可变的,一旦提交到仓库,就无法直接删除。这是因为 Git 的设计哲学之一就是保持数据的完整性和可追溯性。

然而,有几种方法可以处理你所描述的问题:

  1. 使用 git-filter-branchBFG 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

在执行这些操作之前,请确保你完全理解它们的影响,并备份你的仓库。

  1. 创建一个新的分支或仓库

    如果重写历史的风险太高,你可以考虑创建一个新的分支或仓库,并只包含没有问题的提交。这样,你可以保留原始仓库的历史记录,同时在新仓库中提供一个干净的版本。

  2. 修改最新的提交以修复问题

    如果你只是想修复最近的几次提交(例如,修改 commit message 或回滚某个包含敏感信息的提交),你可以使用 git commit --amendgit revert 来实现。但这不会删除原始提交,只是添加新的提交来覆盖或撤销它们。

  3. 从记录中删除敏感信息

    如果敏感信息只是存在于某个文件的某个版本中,你可以使用 git filter-branchBFG Repo-Cleaner 来删除那个文件的所有历史记录,或者只删除包含敏感信息的那个版本。但同样,这会改变项目的历史。

  4. 通知相关人员

    除了技术上的处理,你还需要通知所有相关人员(包括团队成员和其他可能接触到该项目的人)关于这个问题,并告知他们如何更新到修复后的版本。

  5. 防止类似问题再次发生

    最后,确保建立和维护良好的安全实践和代码审查流程,以防止类似的问题再次发生。

请注意,直接修改或删除 Git 历史记录可能会带来风险,特别是在与其他开发者或系统集成的情况下。在执行任何操作之前,请确保你完全理解这些风险,并考虑与团队或组织中的其他成员进行沟通。

1 个回答

上传的敏感资料是否有多次变更?

  • 如果只有在 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 值)

推荐问题
宣传栏