乐闻世界logo
搜索文章和话题

How to remove file from historical commit with Git?

2 个月前提问
2 个月前修改
浏览次数20

1个答案

1

在使用Git时,如果需要从历史提交中彻底删除一个文件,可以使用git filter-branch命令或者第三方工具如BFG Repo-Cleaner。我将分别介绍这两种方法:

方法1:使用 git filter-branch

  1. 打开终端:首先需要打开你的命令行工具。

  2. 定位到仓库目录:使用cd命令切换到你的Git仓库目录。

  3. 执行删除命令:使用以下命令删除文件。

    bash
    git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch 路径到你的文件" \ --prune-empty --tag-name-filter cat -- --all
    • --index-filter:对每个提交都运行的过滤器。
    • "git rm --cached --ignore-unmatch 路径到你的文件":删除指定的文件。
    • --prune-empty:删除因为文件删除变为空的提交。
    • --tag-name-filter cat:处理标签。
    • --all:应用于所有分支和标签。

    举例来说,如果要删除名为secret.txt的文件,你可以这样写:

    bash
    git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch secret.txt" \ --prune-empty --tag-name-filter cat -- --all
  4. 推送更改:完成上述操作后,使用以下命令推送更改到远程仓库。

    bash
    git push origin --force --all git push origin --force --tags

方法2:使用 BFG Repo-Cleaner

  1. 下载并运行BFG:首先你需要从官方网站下载并安装BFG。

  2. 备份你的仓库:在进行这种操作前,建议备份你的仓库。

  3. 使用BFG删除文件

    bash
    java -jar bfg.jar --delete-files 路径到你的文件 你的仓库的目录

    例如,如果要删除secret.txt,你的命令将是:

    bash
    java -jar bfg.jar --delete-files secret.txt my-repo.git
  4. 继续清理并推送

    bash
    cd 你的仓库目录 git reflog expire --expire=now --all && git gc --prune=now --aggressive git push

在使用这些工具时,请确保你完全理解它们的工作原理和潜在的风险。删除历史提交中的文件会改变你的项目历史,可能会影响其他协作者的仓库状态。此外,一旦这些更改被推送,所有的历史版本都将被重写,这可能会导致数据丢失。

2024年7月16日 00:12 回复

你的答案