📌  相关文章
📜  从 git 中删除文件历史记录 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:36:13.403000             🧑  作者: Mango

从 git 中删除文件历史记录 - Shell/Bash

有时候我们会在 Git 仓库中意外提交了一些敏感的文件、密码文件等等,并且我们需要将这些文件从仓库中完全删除,一般的推送回退只是将最新的提交回退,而不会将历史记录删除。本文将介绍如何从 Git 中删除文件历史记录,完全删除这些文件。

Step 1: 下载 BFG 工具

我们需要先下载 BFG 工具来处理这个问题。BFG 是一个 GitHub 开源项目,提供一个简单的,高效的用于移除文件和文件内容的 Git 丰富命令。

BFG 工具的下载地址:https://rtyley.github.io/bfg-repo-cleaner/

Step 2: 备份 Git 仓库(可选)

在进行任何更改操作之前,最好先备份您的 Git 仓库,以避免不可预知的错误。

$ git clone --mirror git://example.com/some-big-repo.git

说明:

这将克隆整个仓库,包括所有分支和提交。

Step 3: 运行 BFG 工具

假设我们想要删除敏感文件 passwords.txt,我们可以使用以下命令运行 BFG 工具:

$ java -jar ~/Downloads/bfg-1.13.0.jar --delete-files passwords.txt your_repo.git

说明:

  • --delete-files passwords.txt: 表示删除名为 passwords.txt 的文件
  • your_repo.git: 表示您要进行修改的 Git 仓库

运行 BFG 后,BFG 将会对您的 Git 仓库进行修改,将历史记录中的所有引用转换到新 Git 历史记录上。

Step 4: 清洗 Git 仓库

运行以下命令,以清理您的 Git 仓库。

$ cd your_repo.git
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive

说明:

  • git reflog expire --expire=now --all: 这命令将 Git 仓库中所有项目和分支的 reflog(引用日志)删除,只保留当前 reflog 的活动内容
  • git gc --prune=now --aggressive: 这个命令将 Git 仓库中废弃的对象进行编译,并且进行打包压缩,以使仓库更小。 --prune=now 表示清除所有垃圾文件。
Step 5: 推送到 Git 仓库

最后,您可以将修改的 Git 仓库推送到原始 Git 仓库。

$ git push
总结

通过本文,我们了解了如何使用 BFG 工具从 Git 中删除文件历史记录,并完全清理 Git 仓库,以避免敏感文件泄露的风险。