#!/bin/bash # ============================================================================= # 上游同步脚本 - StarFireAPI # ============================================================================= # 功能:从上游 sub2api 仓库拉取最新代码并重新应用自定义配置 # 用法:./scripts/sync-upstream.sh # ============================================================================= set -e # 遇到错误立即退出 # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 配置 UPSTREAM_REPO="https://github.com/Wei-Shaw/sub2api.git" UPSTREAM_BRANCH="main" BACKUP_BRANCH_PREFIX="backup" # 日志函数 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 获取当前分支名 get_current_branch() { git rev-parse --abbrev-ref HEAD } # 获取当前提交哈希 get_current_commit() { git rev-parse HEAD } # 主函数 main() { log_info "==========================================" log_info "StarFireAPI 上游同步工具" log_info "==========================================" echo "" # 1. 检查是否在 git 仓库中 if ! git rev-parse --git-dir > /dev/null 2>&1; then log_error "当前目录不是 Git 仓库" exit 1 fi # 2. 检查工作目录是否干净 if [[ -n $(git status -s) ]]; then log_warning "工作目录有未提交的修改" read -p "是否继续?未提交的修改可能丢失 (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_info "已取消操作" exit 0 fi fi CURRENT_BRANCH=$(get_current_branch) CURRENT_COMMIT=$(get_current_commit) log_info "当前分支: $CURRENT_BRANCH" log_info "当前提交: $CURRENT_COMMIT" echo "" # 3. 创建备份分支 BACKUP_BRANCH="${BACKUP_BRANCH_PREFIX}-$(date +%Y%m%d-%H%M%S)" log_info "创建备份分支: $BACKUP_BRANCH" git branch $BACKUP_BRANCH log_success "备份分支已创建" echo "" # 4. 检查并添加上游仓库 log_info "配置上游仓库..." if git remote get-url upstream > /dev/null 2>&1; then CURRENT_UPSTREAM=$(git remote get-url upstream) if [[ "$CURRENT_UPSTREAM" != "$UPSTREAM_REPO" ]]; then log_warning "上游仓库地址不匹配,正在更新..." git remote set-url upstream $UPSTREAM_REPO fi else log_info "添加上游仓库: $UPSTREAM_REPO" git remote add upstream $UPSTREAM_REPO fi log_success "上游仓库配置完成" echo "" # 5. 获取上游最新代码 log_info "从上游获取最新代码..." git fetch upstream log_success "上游代码获取完成" echo "" # 6. 查看上游最新版本 UPSTREAM_LATEST=$(git rev-parse upstream/$UPSTREAM_BRANCH) UPSTREAM_SHORT=$(git rev-parse --short upstream/$UPSTREAM_BRANCH) UPSTREAM_MESSAGE=$(git log -1 --pretty=format:"%s" upstream/$UPSTREAM_BRANCH) log_info "上游最新版本:" echo " 提交: $UPSTREAM_SHORT" echo " 消息: $UPSTREAM_MESSAGE" echo "" # 7. 确认是否继续 read -p "是否重置到上游最新版本并重新应用自定义配置?(y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then log_info "已取消操作" log_info "备份分支已保留: $BACKUP_BRANCH" exit 0 fi # 8. 重置到上游最新版本 log_info "重置到上游最新版本..." git reset --hard upstream/$UPSTREAM_BRANCH log_success "已重置到上游最新版本" echo "" # 9. 应用自定义配置 log_info "应用自定义配置..." # 调用品牌化脚本 if [[ -f "$(dirname "$0")/apply-branding.sh" ]]; then bash "$(dirname "$0")/apply-branding.sh" else log_warning "品牌化脚本不存在,跳过" fi # 调用部署配置脚本 if [[ -f "$(dirname "$0")/apply-deploy-config.sh" ]]; then bash "$(dirname "$0")/apply-deploy-config.sh" else log_warning "部署配置脚本不存在,跳过" fi log_success "自定义配置应用完成" echo "" # 10. 提交修改 if [[ -n $(git status -s) ]]; then log_info "提交自定义配置..." git add -A COMMIT_MESSAGE="同步上游并重新应用自定义配置 上游版本: $UPSTREAM_SHORT 上游消息: $UPSTREAM_MESSAGE 同步时间: $(date '+%Y-%m-%d %H:%M:%S') Co-Authored-By: Claude Opus 4.5 " git commit -m "$COMMIT_MESSAGE" log_success "修改已提交" echo "" else log_info "没有需要提交的修改" echo "" fi # 11. 显示摘要 log_success "==========================================" log_success "同步完成!" log_success "==========================================" echo "" echo "备份分支: $BACKUP_BRANCH" echo "上游版本: $UPSTREAM_SHORT" echo "当前提交: $(get_current_commit | cut -c1-7)" echo "" # 12. 询问是否推送 read -p "是否推送到远程仓库?(y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then log_info "推送到远程仓库..." git push origin $CURRENT_BRANCH --force log_success "推送完成" else log_info "已跳过推送,请稍后手动执行: git push origin $CURRENT_BRANCH --force" fi echo "" log_info "如需回滚,请执行: git reset --hard $BACKUP_BRANCH" } # 执行主函数 main "$@"