1+ name : Sync Upstream Safely
2+
3+ on :
4+ schedule :
5+ # 每天凌晨 2 点(UTC)运行
6+ - cron : ' 0 2 * * *'
7+ workflow_dispatch : # 允许手动触发
8+
9+ jobs :
10+ sync :
11+ runs-on : ubuntu-latest
12+ env :
13+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 : true
14+ steps :
15+ - name : Checkout code
16+ uses : actions/checkout@v4
17+ with :
18+ fetch-depth : 0
19+ token : ${{ secrets.GITHUB_TOKEN }}
20+
21+ - name : Configure Git
22+ run : |
23+ git config --global user.name "github-actions[bot]"
24+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
25+
26+ - name : Add upstream remote
27+ id : upstream
28+ run : |
29+ # 添加上游仓库(请替换为实际的上游仓库地址)
30+ UPSTREAM_REPO="${{ secrets.UPSTREAM_REPO }}"
31+ if [ -z "$UPSTREAM_REPO" ]; then
32+ echo "❌ 未设置 UPSTREAM_REPO secret,请先在仓库设置中添加"
33+ echo "格式: https://github.com/原作者/原仓库名.git"
34+ exit 1
35+ fi
36+
37+ git remote add upstream "$UPSTREAM_REPO"
38+ echo "✅ 已添加上游仓库: $UPSTREAM_REPO"
39+ git fetch upstream
40+
41+ - name : Check upstream changes
42+ id : check
43+ run : |
44+ # 获取当前分支的文件列表
45+ CURRENT_FILES=$(git ls-tree -r HEAD --name-only | wc -l)
46+
47+ # 获取上游分支的文件列表
48+ UPSTREAM_FILES=$(git ls-tree -r upstream/main --name-only | wc -l)
49+
50+ # 检测删除的文件数量
51+ DELETED_FILES=$(git diff --name-only HEAD upstream/main | grep "^-" | wc -l || echo 0)
52+
53+ # 计算删除比例
54+ if [ $CURRENT_FILES -gt 0 ]; then
55+ DELETE_RATIO=$((DELETED_FILES * 100 / CURRENT_FILES))
56+ else
57+ DELETE_RATIO=100
58+ fi
59+
60+ echo "current_files=$CURRENT_FILES" >> $GITHUB_OUTPUT
61+ echo "upstream_files=$UPSTREAM_FILES" >> $GITHUB_OUTPUT
62+ echo "deleted_files=$DELETED_FILES" >> $GITHUB_OUTPUT
63+ echo "delete_ratio=$DELETE_RATIO" >> $GITHUB_OUTPUT
64+
65+ echo "📊 变更统计:"
66+ echo " - 当前文件数: $CURRENT_FILES"
67+ echo " - 上游文件数: $UPSTREAM_FILES"
68+ echo " - 删除文件数: $DELETED_FILES"
69+ echo " - 删除比例: $DELETE_RATIO%"
70+
71+ # 显示变更详情
72+ echo ""
73+ echo "📝 变更文件列表:"
74+ git diff --stat HEAD upstream/main || echo " (无变更)"
75+
76+ - name : Stop and notify if deletion > 10%
77+ if : steps.check.outputs.delete_ratio > 10
78+ run : |
79+ RATIO=${{ steps.check.outputs.delete_ratio }}
80+ DELETED=${{ steps.check.outputs.deleted_files }}
81+
82+ echo ""
83+ echo "⚠️ 检测到上游删除了 $DELETED 个文件(删除比例 $RATIO%)"
84+ echo "⚠️ 超过 10% 阈值,为保护数据,已停止自动同步"
85+ echo ""
86+ echo "🔍 请手动审查上游变更:"
87+ echo " 1. 访问上游仓库查看变更详情"
88+ echo " 2. 如果确认安全,手动执行同步或重新运行此 workflow"
89+ echo " 3. 修改此 workflow 中的阈值(当前 10%)以调整敏感度"
90+ echo ""
91+ echo "🛡️ 你的数据已受到保护,不会自动同步此变更"
92+ exit 1
93+
94+ - name : Backup before sync
95+ run : |
96+ # 创建备份标签
97+ BACKUP_TAG="backup-$(date +%Y%m%d-%H%M%S)"
98+ git tag "$BACKUP_TAG"
99+ git push origin "$BACKUP_TAG"
100+ echo "✅ 已创建备份标签: $BACKUP_TAG"
101+
102+ - name : Sync with upstream
103+ if : steps.check.outputs.delete_ratio <= 10
104+ run : |
105+ # 检测主分支名称
106+ MAIN_BRANCH=$(git rev-parse --abbrev-ref HEAD)
107+
108+ echo "🔄 正在同步上游更新..."
109+ git merge upstream/main --no-edit
110+
111+ echo "📤 正在推送到 origin..."
112+ git push origin "$MAIN_BRANCH"
113+
114+ echo "✅ 同步完成!"
115+
116+ - name : Notify on success
117+ if : success()
118+ run : |
119+ RATIO=${{ steps.check.outputs.delete_ratio }}
120+ echo "✅ 上游同步成功"
121+ echo " 删除比例: $RATIO%(安全阈值: 10%)"
122+
123+ - name : Notify on failure
124+ if : failure()
125+ run : |
126+ echo "❌ 同步失败或被阻止"
127+ echo " 请检查上方日志了解详情"
0 commit comments