60 lines
1.5 KiB
Bash
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 "⚠️ 建议:吊销相关凭证,并审查配置文件泄露风险。"
|
|
|