add scripts/rewrite-cover-history.sh
This commit is contained in:
parent
f5e5ae0b22
commit
ea4aa2ea16
30
scripts/rewrite-cover-history.sh
Normal file
30
scripts/rewrite-cover-history.sh
Normal file
@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# 用法:bash rewrite-cover-history.sh path1 [path2 ...]
|
||||
[ $# -gt 0 ] || { echo "Usage: $0 <path> [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"
|
||||
Loading…
Reference in New Issue
Block a user