Files
ykxmz/_build/scrub_password_history.sh
T
xmz7891 e1c04d617a 清掉工作区最后两处明文密码 + 加 .gitignore 规则
演练 scrub_password_history.sh 时抓出来的:

1. _build/rotate_password.sh —— **我自己写的脚本**,
   为了测「老密码应该登不上」,把老密码写进去了。
   改成从 OLD_ADMIN_PASSWORD 环境变量取,不设就跳过。
   (又一次证明:写测试的时候很容易顺手把秘密抄进去)

2. _build/_hdr_data/data/admin_password.txt —— 测试数据文件,
   居然被 git 跟踪着。已 git rm --cached。

3. .gitignore 加了规则,以后 admin_password.txt 进不来:
       admin_password.txt
       *admin_password*.txt
       /_build/_hdr_data/
       /_build/relay_info.json

现在工作区搜不到明文密码了,只剩 git 历史里那 7 个提交
(等用户确认后再做历史重写 + 强制推送)。
2026-10-07 20:50:25 +08:00

106 lines
3.5 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "============================================================"