#!/usr/bin/env bash # sync-upstream.sh — 从 upstream (origin/main) 同步更新,保留自定义改动 # 用法: ./tools/scripts/sync-upstream.sh set -euo pipefail REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" UPSTREAM="origin/main" cd "$REPO_ROOT" echo "========================================" echo " Antigravity Fork — Upstream Sync Tool" echo "========================================" echo "" # Step 1: 检查工作区 if ! git diff --quiet || ! git diff --staged --quiet; then echo "❌ 工作区有未提交的改动,请先 git stash 或 git commit" git status --short exit 1 fi # Step 2: Fetch echo "[1/4] Fetching upstream..." git fetch origin # Step 3: 检查是否有新 commits NEW=$(git log --oneline HEAD.."$UPSTREAM" 2>/dev/null | wc -l | tr -d ' ') if [ "$NEW" -eq 0 ]; then echo "✅ 已是最新,无需同步。" exit 0 fi echo "" echo "上游有 $NEW 个新 commits:" git log --oneline HEAD.."$UPSTREAM" echo "" # Step 4: 备份当前 patches PATCH_DIR="/tmp/antigravity-patches-$(date +%Y%m%d-%H%M%S)" echo "[2/4] 备份自定义 patches 到 $PATCH_DIR ..." mkdir -p "$PATCH_DIR" git format-patch "$UPSTREAM"..HEAD -o "$PATCH_DIR/" --no-stat BACKED=$(ls "$PATCH_DIR"/*.patch 2>/dev/null | wc -l | tr -d ' ') echo " 已备份 $BACKED 个 patch" # Step 5: Rebase echo "" echo "[3/4] 执行 rebase (git rebase $UPSTREAM)..." echo " 如果出现冲突,请参考 .agents/workflows/sync-upstream.md 中的冲突解决指南" echo "" if ! git rebase "$UPSTREAM"; then echo "" echo "❌ Rebase 出现冲突!" echo "" echo "请按以下步骤处理:" echo " 1. 查看冲突文件: git diff --name-only --diff-filter=U" echo " 2. 解决冲突(参考 .agents/workflows/sync-upstream.md)" echo " 3. git add <解决的文件>" echo " 4. git rebase --continue" echo "" echo "备份的 patches 在: $PATCH_DIR" exit 1 fi # Step 6: 编译验证 echo "[4/4] 编译验证..." if ! (cd "$REPO_ROOT/backend" && go build ./... 2>&1); then echo "" echo "❌ 编译失败!rebase 后有破坏性改动需要修复。" echo "备份的 patches 在: $PATCH_DIR" exit 1 fi echo "" echo "✅ 同步完成!" echo "" echo "自定义改动(我方 commits)已成功移植到最新 upstream 上。" echo "请运行以下命令推送:" echo " git push origin main --force-with-lease" echo "" echo "备份路径(可删除): $PATCH_DIR"