# Conflicts: # account/Makefile # account/go.mod # docs/account-admin-settings.md # docs/account-svc-plus.md
90 lines
2.4 KiB
Bash
90 lines
2.4 KiB
Bash
#!/usr/bin/env bash
|
||
#
|
||
# clean_git_history.sh
|
||
# 用于清理指定文件的历史提交记录,但保留当前版本
|
||
#
|
||
# 使用示例:
|
||
# ./clean_git_history.sh sql/schema_pglogical_region.sql
|
||
#
|
||
|
||
set -euo pipefail
|
||
|
||
# ==============================
|
||
# 1️⃣ 参数检查
|
||
# ==============================
|
||
if [ "$#" -lt 1 ]; then
|
||
echo "❌ 用法: $0 <file1> [file2 ...]"
|
||
exit 1
|
||
fi
|
||
|
||
# ==============================
|
||
# 2️⃣ 备份远程配置
|
||
# ==============================
|
||
REMOTE_URL=$(git remote get-url origin)
|
||
echo "🧭 当前远程仓库: $REMOTE_URL"
|
||
echo "📦 正在备份远程配置..."
|
||
echo "$REMOTE_URL" > .git/remote_backup.url
|
||
|
||
# ==============================
|
||
# 3️⃣ 暂存当前文件内容
|
||
# ==============================
|
||
TMP_DIR=$(mktemp -d)
|
||
echo "📂 临时保存当前版本到: $TMP_DIR"
|
||
for FILE in "$@"; do
|
||
if [ -f "$FILE" ]; then
|
||
mkdir -p "$TMP_DIR/$(dirname "$FILE")"
|
||
cp "$FILE" "$TMP_DIR/$FILE"
|
||
echo "✅ 已备份当前版本: $FILE"
|
||
else
|
||
echo "⚠️ 警告: 文件不存在 $FILE"
|
||
fi
|
||
done
|
||
|
||
# ==============================
|
||
# 4️⃣ 执行历史清理
|
||
# ==============================
|
||
echo "🧹 正在清理历史记录 (使用 git-filter-repo)..."
|
||
sleep 2
|
||
git filter-repo --invert-paths $(for f in "$@"; do echo --path "$f"; done) --force
|
||
|
||
# ==============================
|
||
# 5️⃣ 恢复远程配置
|
||
# ==============================
|
||
git remote remove origin || true
|
||
git remote add origin "$REMOTE_URL"
|
||
echo "🔗 已恢复远程配置: $REMOTE_URL"
|
||
|
||
# ==============================
|
||
# 6️⃣ 恢复文件并提交
|
||
# ==============================
|
||
echo "♻️ 恢复当前版本的文件..."
|
||
for FILE in "$@"; do
|
||
mkdir -p "$(dirname "$FILE")"
|
||
cp "$TMP_DIR/$FILE" "$FILE" 2>/dev/null || true
|
||
done
|
||
|
||
git add "$@"
|
||
git commit -m "chore: re-add cleaned files after history purge"
|
||
|
||
# ==============================
|
||
# 7️⃣ 推送并覆盖远程
|
||
# ==============================
|
||
echo "🚀 推送变更并覆盖远程历史..."
|
||
git push origin --force --all
|
||
git push origin --force --tags
|
||
|
||
# ==============================
|
||
# 8️⃣ 清理临时文件
|
||
# ==============================
|
||
rm -rf "$TMP_DIR"
|
||
echo "🧽 清理完成,临时目录已删除。"
|
||
|
||
# ==============================
|
||
# 9️⃣ 提示用户
|
||
# ==============================
|
||
echo
|
||
echo "✅ 已完成历史清理。"
|
||
echo "请检查文件是否恢复正确,然后执行:"
|
||
echo " git log -- <file>"
|
||
echo "以确认历史提交已被清空。"
|