117 lines
3.5 KiB
Bash
Executable File
117 lines
3.5 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# 自动双向同步脚本
|
|
# 监控 sanguo_projects 目录下所有子项目,每个子项目是独立 git 仓库
|
|
# 双向同步本地和远程Gitee
|
|
# 错误处理:失败了记录日志不继续错误扩散
|
|
|
|
PROJECT_DIR="/Users/chufeng/.openclaw/sanguo_projects"
|
|
LOG_FILE="$PROJECT_DIR/auto-sync.log"
|
|
MAX_RETRIES=2
|
|
|
|
# 需要同步的项目列表(每个都是独立 git 仓库)
|
|
PROJECTS=(
|
|
"sanguo_quant_live"
|
|
"sanguo_mail"
|
|
"sanguo_vnpy"
|
|
)
|
|
|
|
# 确保目录存在
|
|
cd "$PROJECT_DIR" || {
|
|
echo "[$(date)] ERROR: Failed to cd into $PROJECT_DIR" >> "$LOG_FILE"
|
|
exit 1
|
|
}
|
|
|
|
echo "[$(date)] ========================================" >> "$LOG_FILE"
|
|
echo "[$(date)] Starting auto sync for all projects..." >> "$LOG_FILE"
|
|
|
|
# 同步单个项目函数
|
|
sync_project() {
|
|
local project=$1
|
|
local dir="$PROJECT_DIR/$project"
|
|
|
|
if [[ ! -d "$dir/.git" ]]; then
|
|
echo "[$(date)] [$project] SKIP: not a git repository, skipping" >> "$LOG_FILE"
|
|
return 0
|
|
fi
|
|
|
|
echo "[$(date)] [$project] Starting sync..." >> "$LOG_FILE"
|
|
cd "$dir"
|
|
|
|
# 第一步:git pull 拉取远程变更
|
|
echo "[$(date)] [$project] Step 1: git pull origin main" >> "$LOG_FILE"
|
|
git pull origin main
|
|
exit_code=$?
|
|
|
|
if [ $exit_code -ne 0 ]; then
|
|
echo "[$(date)] [$project] WARNING: git pull failed with exit code $exit_code" >> "$LOG_FILE"
|
|
# pull失败不推送,避免冲突
|
|
return 1
|
|
fi
|
|
|
|
echo "[$(date)] [$project] git pull success" >> "$LOG_FILE"
|
|
|
|
# 第二步:添加所有变更(包括未跟踪文件)
|
|
echo "[$(date)] [$project] Step 2: Adding all changes..." >> "$LOG_FILE"
|
|
git add .
|
|
exit_code=$?
|
|
if [ $exit_code -ne 0 ]; then
|
|
echo "[$(date)] [$project] ERROR: git add failed with exit code $exit_code" >> "$LOG_FILE"
|
|
return 1
|
|
fi
|
|
|
|
# 第三步:检查是否有内容需要提交
|
|
if git diff --cached --quiet; then
|
|
# 没有变更需要提交,正常退出
|
|
echo "[$(date)] [$project] No changes to commit, done." >> "$LOG_FILE"
|
|
return 0
|
|
fi
|
|
|
|
# 有变更,进行提交
|
|
echo "[$(date)] [$project] Step 3: Found changes to commit, committing..." >> "$LOG_FILE"
|
|
|
|
git commit -m "auto-sync: $(date '+%Y-%m-%d %H:%M:%S')"
|
|
exit_code=$?
|
|
if [ $exit_code -ne 0 ]; then
|
|
echo "[$(date)] [$project] ERROR: git commit failed with exit code $exit_code" >> "$LOG_FILE"
|
|
return 1
|
|
fi
|
|
|
|
# 推送到远程
|
|
echo "[$(date)] [$project] Step 4: Pushing to origin/main..." >> "$LOG_FILE"
|
|
|
|
for i in $(seq 1 $MAX_RETRIES); do
|
|
git push origin main
|
|
exit_code=$?
|
|
if [ $exit_code -eq 0 ]; then
|
|
echo "[$(date)] [$project] Push success! Sync complete." >> "$LOG_FILE"
|
|
return 0
|
|
fi
|
|
echo "[$(date)] [$project] Push attempt $i failed, retrying..." >> "$LOG_FILE"
|
|
sleep 2
|
|
done
|
|
|
|
echo "[$(date)] [$project] ERROR: Push failed after $MAX_RETRIES attempts" >> "$LOG_FILE"
|
|
return 1
|
|
}
|
|
|
|
# 遍历所有项目进行同步
|
|
FAILED_PROJECTS=""
|
|
for project in "${PROJECTS[@]}"; do
|
|
echo "" >> "$LOG_FILE"
|
|
sync_project "$project"
|
|
if [ $? -ne 0 ]; then
|
|
FAILED_PROJECTS="$FAILED_PROJECTS $project"
|
|
fi
|
|
done
|
|
|
|
echo "" >> "$LOG_FILE"
|
|
echo "[$(date)] Sync finished." >> "$LOG_FILE"
|
|
if [[ -n "$FAILED_PROJECTS" ]]; then
|
|
echo "[$(date)] WARNING: Some projects failed to sync:$FAILED_PROJECTS" >> "$LOG_FILE"
|
|
exit 1
|
|
else
|
|
echo "[$(date)] All projects synced successfully!" >> "$LOG_FILE"
|
|
exit 0
|
|
fi
|