You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何删除GitHub已删文件修订历史及清理Git迁移残留大文件?

清理Git仓库中特定大文件的修订历史

嘿,这个问题我碰到过好多次了——完全可以删除特定文件的所有修订历史,而且针对你这种SVN迁移后遗留大二进制文件历史的场景,有一套成熟的方案,既能彻底清掉这些占空间的家伙,又能保住其他文件的完整提交记录。

具体解决方案

我推荐两种工具,都是Git生态里常用的历史清理工具,你可以根据自己的习惯选:

方法1:用git filter-repo(Git官方推荐,替代老旧的git filter-branch

这个工具是官方现在主推的,比旧工具更稳定、速度也更快,步骤如下:

  1. 先做备份!先做备份!先做备份! 重要的事说三遍,先克隆一份仓库的镜像作为备份,避免操作失误丢数据:
    git clone --mirror <你的GitHub仓库URL>
    cd <仓库名>.git
    
  2. 移除指定大文件的所有历史痕迹:假设你的大文件叫big-file1.binbig-file2.bin,可以逐个处理,或者用通配符批量处理:
    # 单个文件
    git filter-repo --path big-file1.bin --invert-paths
    # 多个文件
    git filter-repo --path big-file1.bin --path big-file2.bin --invert-paths
    # 如果文件在特定目录下,比如old-assets/,就写完整路径
    git filter-repo --path old-assets/big-file.bin --invert-paths
    
    这个命令会遍历所有提交历史,把包含这些文件的记录全部移除,还会自动调整后续提交的文件结构,不会留下断链。
  3. 强制推送到GitHub:因为我们重写了仓库历史,所以需要强制推送(记得提前跟团队成员说一声,让他们之后重新克隆仓库,不然会有历史冲突):
    git push --force
    
  4. 清理本地工作仓库的冗余数据:回到你平时用的本地仓库,执行下面的命令同步新历史并清理垃圾:
    git fetch --prune
    git rebase origin/main # 这里换成你的主分支名,比如master
    git gc --prune=now
    

方法2:用BFG Repo-Cleaner(更轻量化的大文件清理工具)

如果觉得git filter-repo步骤有点繁琐,可以试试BFG,它专门针对大文件和敏感内容清理,操作更简洁:

  1. 先下载BFG的jar包,然后同样先做仓库镜像备份。
  2. 清理大文件:两种方式,要么按文件大小清理,要么指定文件名:
    # 移除所有大于700MB的文件
    java -jar bfg.jar --strip-blobs-bigger-than 700M <你的镜像仓库路径>
    # 或者指定具体文件名,支持通配符
    java -jar bfg.jar --delete-files big-file*.bin <你的镜像仓库路径>
    
  3. 收尾并推送
    cd <镜像仓库路径>
    git reflog expire --expire=now --all && git gc --prune=now --aggressive
    git push --force
    

关键注意事项

  • 团队同步:历史重写后,所有团队成员必须丢弃本地的旧仓库,重新克隆新的仓库,否则后续提交会出现严重的历史冲突。
  • GitHub分支保护:如果你的主分支开启了分支保护(比如main分支),需要先临时关闭保护设置,才能执行强制推送。
  • 验证效果:推送完成后,你可以在本地仓库执行git count-objects -vH,看看仓库的对象大小是不是已经降下来了,确认大文件的历史确实被清掉了。

内容的提问来源于stack exchange,提问作者Kalaiyarasan

火山引擎 最新活动