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

How can I remove/delete a large file from the commit history in the Git repository?

1 个月前提问
1 个月前修改
浏览次数9

1个答案

1

处理Git仓库中的大文件时,特别是要从历史记录中完全删除它们,我们通常有几种方法可以选择。下面是几种处理此问题的有效方法:

方法1: 使用 git filter-branch

git filter-branch 命令可以重写大量的分支中的提交历史,从中可以移除不需要的大文件。具体步骤如下:

  1. 找出大文件: 使用 git rev-list 配合 git ls-tree 检查每个对象的大小,找出需要删除的大文件。

    bash
    git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | sort -k3nr
  2. 执行 filter-branch: 确定文件路径后,使用 git filter-branch 命令配合 --index-filter 来删除指定文件。

    bash
    git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch 路径/到/文件" \ --prune-empty --tag-name-filter cat -- --all
  3. 推送更改: 在本地历史被重写后,强制推送到远程仓库。

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

方法2: 使用 git-lfs

对于频繁变动的大文件,使用 Git Large File Storage (LFS) 是一个更好的策略。它允许将大文件的指针提交到Git仓库,而将实际文件内容存储在远程服务器上。

  1. 安装 Git LFS: 首先需要安装 Git LFS 工具。

    bash
    git lfs install
  2. 追踪大文件: 使用 git lfs track 命令来追踪那些大文件。

    bash
    git lfs track "*.psd" git add .gitattributes
  3. 提交并推送: 提交更改并推送到远程仓库。

    bash
    git add 文件名.psd git commit -m "Add large file with LFS" git push

方法3: 使用 BFG Repo-Cleaner

BFG 是一个比 git filter-branch 更快的工具,专门用于从Git仓库中删除大文件或密码。

  1. 下载并运行 BFG:

    bash
    java -jar bfg.jar --strip-blobs-bigger-than 100M
  2. 强制推送到远程仓库:

    bash
    git reflog expire --expire=now --all && git gc --prune=now --aggressive git push

使用这些方法可以有效地从Git仓库的历史记录中清除大文件,帮助减少仓库的大小并改善性能。选用哪种方法取决于具体情况和个人喜好。

2024年8月8日 09:30 回复

你的答案