diff --git a/scripts/rewrite-cover-history.sh b/scripts/rewrite-cover-history.sh new file mode 100644 index 0000000..3135e24 --- /dev/null +++ b/scripts/rewrite-cover-history.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +set -euo pipefail + +# 用法:bash rewrite-cover-history.sh path1 [path2 ...] +[ $# -gt 0 ] || { echo "Usage: $0 [path ...]"; exit 1; } +PATHS="$*" + +# 记录 remotes,并打个回滚点(本地) +git remote -v | tee remotes.before.txt +git tag "pre-redact-$(date +%Y%m%d-%H%M%S)" + +# 核心:对历史中每个提交,若文件存在则用 HEAD 版本覆盖 +git filter-branch --force --tree-filter ' +for p in '"$PATHS"'; do + [ -e "$p" ] && git show HEAD:"$p" > "$p" || true +done +' -- --all + +# 清理原始引用与垃圾对象(避免泄漏对象残留) +git for-each-ref --format="delete %(refname)" refs/original/ | git update-ref --stdin || true +git reflog expire --expire=now --all +git gc --prune=now --aggressive + +# 强制推送到所有 remotes(分支与标签) +for r in $(git remote); do + git push --force-with-lease "$r" --all + git push --force "$r" --tags +done + +echo "✅ Done. 协作者请重新克隆或:git fetch --all && git reset --hard origin/$(git rev-parse --abbrev-ref HEAD) && git gc --prune=now"