#!/bin/bash set -e # 遇到错误立即停止 # ========== 配置 ========== WORKSPACE="/home/cpp_competition" # 你的开发目录(只读源) BACKUP_DIR="/tmp/git_backup_$(date +%s)" # 临时备份目录 REPO_URL="https://${GH_TOKEN}@github.com/${GH_USERNAME}/${REPO_NAME}.git" BRANCH_BACKUP="auto-backup" # ========== 在隔离环境备份 ========== echo "[$(date)] Starting isolated backup..." # 1. 克隆仓库到临时目录 # 优先尝试克隆备份分支,如果不存在则克隆主分支 if git clone --depth 1 --branch "$BRANCH_BACKUP" "$REPO_URL" "$BACKUP_DIR" 2>/dev/null; then echo "Cloned existing $BRANCH_BACKUP branch." else echo "Backup branch not found, cloning main branch." git clone --depth 1 --branch "main" "$REPO_URL" "$BACKUP_DIR" fi cd "$BACKUP_DIR" # 2. 确保在备份分支上 git checkout -b "$BRANCH_BACKUP" 2>/dev/null || git checkout "$BRANCH_BACKUP" # 3. 将工作目录的文件同步过来(排除.git目录) echo "Syncing files from workspace..." rsync -av --delete --exclude='.git/' "$WORKSPACE/" ./ # 4. 检查、提交、推送 if [[ -n $(git status --porcelain) ]]; then git add -A git commit -m "Auto-commit: $(date '+%Y-%m-%d %H:%M:%S')" # 推送时将使用全局配置的凭证 if git push origin "$BRANCH_BACKUP"; then echo "[$(date)] Backup succeeded to $BRANCH_BACKUP." else echo "[$(date)] ERROR: Push failed. Check your credentials." >&2 exit 1 fi else echo "[$(date)] No changes to backup." fi # 5. 清理临时目录 cd / rm -rf "$BACKUP_DIR" echo "[$(date)] Backup process completed."