diff --git a/scripts/clean_git_binaries_fixed.sh b/scripts/clean_git_binaries_fixed.sh new file mode 100644 index 00000000..b8a0c9d7 --- /dev/null +++ b/scripts/clean_git_binaries_fixed.sh @@ -0,0 +1,50 @@ +#!/bin/bash +set -e + +echo "📦 自动扫描 Git 中最大的历史文件并清理..." + +# 检查 git-filter-repo 是否存在 +if ! command -v git-filter-repo &> /dev/null; then + echo "❌ 请先安装 git-filter-repo(https://github.com/newren/git-filter-repo)" + exit 1 +fi + +# 提取前 20 个最大文件路径(唯一化) +echo "🔍 获取 Git 历史中前 20 个大文件路径..." +LARGE_PATHS=$(git rev-list --objects --all | \ + git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | \ + grep '^blob' | \ + sort -k3 -n -r | \ + head -20 | \ + awk '{print $4}' | sort | uniq) + +echo "🗑️ 以下路径将被从 Git 历史中永久删除:" +echo "$LARGE_PATHS" + +# 确认清理 +read -p "⚠️ 确定要执行清理吗?此操作将重写历史 (y/n): " confirm +if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then + echo "❎ 已取消" + exit 0 +fi + +# 构造参数数组并执行 git-filter-repo +echo "🚨 正在清理..." +git filter-repo \ + $(echo "$LARGE_PATHS" | awk '{print "--path " $1}') \ + --invert-paths + +echo "✅ 清理完成!你现在可以检查仓库大小:du -sh .git" + +# 可选推送 +read -p "🚀 是否强制推送更改到远程?(y/n): " pushconfirm +if [[ "$pushconfirm" == "y" || "$pushconfirm" == "Y" ]]; then + git push origin --force --all + git push origin --force --tags + echo "✅ 已强推完成" +else + echo "⚠️ 请手动执行以下命令推送:" + echo " git push origin --force --all" + echo " git push origin --force --tags" +fi +