accounts/docs/remove-secret.sh

60 lines
1.5 KiB
Bash

#!/bin/bash
set -e
echo "📁 当前目录:$(pwd)"
# ✅ 检查是否为 Git 仓库
if [ ! -d .git ]; then
echo "❌ 当前目录不是 Git 仓库,请切换到仓库根目录再运行此脚本。"
exit 1
fi
# ✅ 检查依赖项
for cmd in git-filter-repo gitleaks jq; do
if ! command -v $cmd &>/dev/null; then
echo "❌ 缺少依赖:$cmd,请先安装。"
exit 1
fi
done
# ✅ 设置变量并注册清理机制
GITLEAKS_OUTPUT="gitleaks-report.json"
EXCLUDE_FILE=$(mktemp)
cleanup() {
echo "🧽 清理临时文件..."
rm -f "$GITLEAKS_OUTPUT" "$EXCLUDE_FILE"
}
trap cleanup EXIT
# ✅ 执行 gitleaks 检查
echo "🔍 正在执行 gitleaks 扫描敏感文件..."
gitleaks detect --no-banner --report-format=json --report-path="$GITLEAKS_OUTPUT" --source . --log-opts='--all'
# ✅ 提取泄露文件路径
LEAK_PATHS=$(jq -r '.[].File' "$GITLEAKS_OUTPUT" | sort | uniq)
if [ -z "$LEAK_PATHS" ]; then
echo "✅ 未发现泄露文件,无需清理历史版本。"
exit 0
fi
echo "🚨 以下文件将从 Git 历史中彻底删除:"
echo "$LEAK_PATHS"
# ✅ 循环删除每个路径
for path in $LEAK_PATHS; do
echo "🧹 删除历史中的文件:$path"
git filter-repo --force --path "$path" --invert-paths
done
# ✅ 强制推送历史
echo "🚀 正在强制推送到远程(覆盖历史)..."
git push --force --all
git push --force --tags
echo ""
echo "✅ 敏感文件历史版本已彻底删除并推送完成。"
echo "⚠️ 建议:吊销相关凭证,并审查配置文件泄露风险。"