要删除 Git 项目中的大历史文件,您可以使用以下步骤。这个过程会重写您的 Git 历史,所以请确保在进行这些操作之前已经备份了您的仓库,并且已经与团队成员沟通好。

  1. 找出大文件

首先,使用以下命令找出仓库中最大的文件:

git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

这会列出仓库中最大的 5 个文件。

  1. 从所有分支中删除文件

使用 git filter-branch 命令从所有分支中删除文件:

git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch PATH_TO_FILE" \
  --prune-empty --tag-name-filter cat -- --all

将 PATH_TO_FILE 替换为您想要删除的文件路径。如果要删除多个文件,可以多次运行这个命令。

  1. 清理和回收空间

运行以下命令来清理引用并回收空间:

git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now
  1. 强制推送更改

最后,强制推送更改到远程仓库:

git push origin --force --all

如果您有标签,也需要强制推送:

git push origin --force --tags
  1. 清理本地仓库(可选)

如果您想完全清理本地仓库,可以删除它并重新克隆:

cd ..
rm -rf repo_name
git clone repo_url

注意事项:

  • 这个过程会改变提交历史,所有人都需要重新克隆仓库或进行复杂的本地历史调整。
  • 如果是共享仓库,确保所有协作者都知道您要进行这个操作。
  • 一些代码托管平台(如 GitHub)可能有文件大小限制,确保您的更改符合这些限制。

如果您不确定如何操作或担心可能出错,建议在进行这些操作之前咨询有经验的 Git 用户或您的团队成员。

如果只需要删除指定后缀的文件历史呢?

如果您只需要删除指定后缀的文件历史,我们可以修改上述过程中的 git filter-branch 命令。这里是针对特定后缀文件的删除过程:

使用以下命令从所有分支中删除指定后缀的文件:

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch *.后缀' \
  --prune-empty --tag-name-filter cat -- --all

*.后缀 替换为您想要删除的文件后缀。例如,如果要删除所有 .mp4 文件,就使用 *.mp4

如果要删除多个后缀,可以这样写:

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch *.mp4 *.avi *.mov' \
  --prune-empty --tag-name-filter cat -- --all