#!/bin/bash # 把明文管理密码从**整个 git 历史**里抹掉。 # # ⚠ 这是个危险操作: # * 会重写所有提交的哈希 # * 需要 force push 才能同步到远端 # * 别人如果已经 clone 过,他们手上的历史还是旧的 # # 所以跑之前一定先备份: # git bundle create ../backup.bundle --all # # 用法: # bash _build/scrub_password_history.sh # 演练(只报告,不改) # bash _build/scrub_password_history.sh --apply # 真的改 set -u OLD="REVA""edu120830" # 拼出来,免得这个脚本自己又成为一个泄漏点 NEW="(已移除,见 relay.py 的说明)" cd "$(dirname "$0")/.." || exit 1 APPLY=0 [ "${1:-}" = "--apply" ] && APPLY=1 echo "============================================================" if [ "$APPLY" = "1" ]; then echo " 模式:**真的重写历史**" else echo " 模式:演练(只看会改什么,不动手)" echo " 要真改就加 --apply" fi echo "============================================================" echo echo "── 1. 哪些提交受影响 ──" git log --all --oneline -S "$OLD" | sed 's/^/ /' N=$(git log --all --oneline -S "$OLD" | wc -l) echo " 共 $N 个提交" echo echo "── 2. 哪些文件受影响(当前工作树)──" git grep -l "$OLD" -- . 2>/dev/null | sed 's/^/ /' || echo " (当前工作树已经干净)" echo echo "── 3. 备份 ──" BK="../ykxmz-repo-backup-$(date +%m%d-%H%M).bundle" if [ "$APPLY" = "1" ]; then git bundle create "$BK" --all >/dev/null 2>&1 && \ echo " ✓ 已备份到 $BK" || { echo " ✗ 备份失败,中止"; exit 1; } else echo " (演练模式不备份;真改时会自动备份到 ../ykxmz-repo-backup-*.bundle)" fi if [ "$APPLY" != "1" ]; then echo echo " 演练结束。确认没问题后加 --apply 真的执行。" exit 0 fi echo echo "── 4. 重写历史(git filter-branch)──" echo " 用 tree-filter 逐提交替换,99 个提交大概要几分钟" FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch --force \ --tree-filter " find . -type f \ \\( -name '*.py' -o -name '*.sh' -o -name '*.ps1' \ -o -name '*.md' -o -name '*.txt' -o -name '*.json' \ -o -name '*.java' -o -name '*.iss' -o -name '*.bat' \\) \ -not -path './.git/*' -print0 2>/dev/null | xargs -0 -r sed -i 's/$OLD/$NEW/g' 2>/dev/null true " \ --tag-name-filter cat -- --all 2>&1 | tail -8 echo echo "── 5. 验证历史里还有没有 ──" if git log --all --oneline -S "$OLD" | grep -q .; then echo " ✗ **还有残留**:" git log --all --oneline -S "$OLD" | sed 's/^/ /' else echo " ✓ 历史里搜不到了" fi echo echo "── 6. 清理 reflog 和旧对象 ──" # 不清理的话旧对象还在 .git 里,git log -S 还能搜到 rm -rf .git/refs/original/ git reflog expire --expire=now --all git gc --prune=now --aggressive 2>&1 | tail -2 echo echo "── 7. 再验证一次 ──" if git log --all --oneline -S "$OLD" | grep -q .; then echo " ✗ 还能搜到(reflog 可能没清干净)" else echo " ✓ 干净了" fi echo echo "============================================================" echo " 做完了。接下来要:" echo " git push --force origin main" echo " git push --force ezhub main" echo " ⚠ 这两条要用户明确同意之后才执行。" echo "============================================================"