#!/bin/bash # unity_auto_sync.sh — Unity 프로젝트 git 자동 sync (BT5-Dev C안, 2026-04-23 PD 승인) # Unity Editor GitAutoSync.cs(Process.Start) → 본 스크립트 호출 → 실제 git 작업 # # 용법: unity_auto_sync.sh {init|pull|push|status} # # 경로 규약 (C34-11): # UNITY_PROJECT_ROOT = paths.local.json 에서 읽음 (PC별 실값) # UNITY_GIT_REMOTE = paths.local.json 에서 읽음 (Gitea 레포) # BT 본 레포 루트는 git rev-parse 또는 BURNINGTIMES_ROOT 환경변수 set -u ACTION="${1:-status}" # BT 본 레포 루트 결정 — Unity Editor 호출 시 cwd=Unity 레포이므로 git rev-parse가 오판 # 탐색 순서: 환경변수 > 고정 경로 후보 > git rev-parse (fallback) if [ -n "${BURNINGTIMES_ROOT:-}" ] && [ -d "$BURNINGTIMES_ROOT" ]; then REPO_ROOT="$BURNINGTIMES_ROOT" elif [ -d "E:/BurningTimes" ]; then REPO_ROOT="E:/BurningTimes" elif [ -d "$HOME/BurningTimes" ]; then REPO_ROOT="$HOME/BurningTimes" else REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) fi if [ -z "$REPO_ROOT" ] || [ ! -d "$REPO_ROOT" ]; then echo "❌ BT 본 레포 찾지 못함 — BURNINGTIMES_ROOT 환경변수 설정 필요" >&2 exit 2 fi # paths.local.json 로드 PATHS_FILE="$REPO_ROOT/paths.local.json" if [ ! -f "$PATHS_FILE" ]; then echo "❌ paths.local.json 부재 — template 복사 후 값 입력 필요" >&2 exit 3 fi # JSON 파싱 (jq 있으면 활용, 없으면 grep) read_json() { local key="$1" if command -v jq >/dev/null 2>&1; then jq -r ".${key} // empty" "$PATHS_FILE" 2>/dev/null else grep -o "\"${key}\"[[:space:]]*:[[:space:]]*\"[^\"]*\"" "$PATHS_FILE" 2>/dev/null \ | sed 's/.*"\([^"]*\)"$/\1/' fi } UNITY_ROOT=$(read_json "UNITY_PROJECT_ROOT") UNITY_REMOTE=$(read_json "UNITY_GIT_REMOTE") if [ -z "$UNITY_ROOT" ] || [ "$UNITY_ROOT" = "__SET_PER_PC__" ]; then echo "❌ UNITY_PROJECT_ROOT 미설정 — paths.local.json 편집 필요" >&2 exit 4 fi if [ ! -d "$UNITY_ROOT" ]; then echo "❌ Unity 프로젝트 경로 부재: $UNITY_ROOT" >&2 exit 5 fi # 로그 디렉토리 (BT C34-17 audit 중앙 저장소 연계) LOG_DIR="$HOME/.claude/burningtimes-audit/unity_sync" mkdir -p "$LOG_DIR" LOG_FILE="$LOG_DIR/$(date +%Y-%m-%d).log" log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE" } cd "$UNITY_ROOT" || { echo "❌ cd 실패: $UNITY_ROOT" >&2; exit 6; } # git 레포 미초기화 판정 if [ ! -d ".git" ]; then if [ "$ACTION" = "init" ]; then log "▶️ git init — Unity 프로젝트 레포 초기화" git init -b main 2>&1 | tee -a "$LOG_FILE" # Unity 표준 .gitignore·.gitattributes는 스크립트 외부에서 사전 배치 (Claude Code 직접 작성) if [ -n "$UNITY_REMOTE" ] && [ "$UNITY_REMOTE" != "__SET_PER_PC__" ]; then git remote add origin "$UNITY_REMOTE" 2>&1 | tee -a "$LOG_FILE" log "✅ init + remote 설정 완료 (origin: $UNITY_REMOTE)" else log "⚠️ UNITY_GIT_REMOTE 미설정 — Gitea 레포 생성 후 수동 add 필요" fi log "📌 다음 단계: git add -A && git commit && push" exit 0 else echo "❌ Unity 프로젝트 git 레포 아님. 'init' 먼저 수행" >&2 exit 7 fi fi case "$ACTION" in pull) log "▶️ pull" if git fetch origin 2>&1 | tee -a "$LOG_FILE" \ && git merge --ff-only origin/main 2>&1 | tee -a "$LOG_FILE"; then log "✅ pull 완료" exit 0 else log "❌ pull 실패 (충돌/네트워크/레포 미생성 가능) — 수동 개입 필요" exit 8 fi ;; push) log "▶️ push — add + commit + push" git add -A 2>&1 | tee -a "$LOG_FILE" if git diff --cached --quiet; then log "ℹ️ 스테이징 변경 없음" # 선행 commit 있으면 push if git log origin/main..HEAD --oneline 2>/dev/null | grep -q .; then log "▶️ 로컬 선행 commit push 시도" if git push origin main 2>&1 | tee -a "$LOG_FILE"; then log "✅ 선행 commit push 완료" exit 0 fi fi log "ℹ️ push 대상 없음 — 정상 종료" exit 0 fi # 현재 scene 추정 (Unity EditorBuildSettings 기반) SCENE="unknown" if [ -f "ProjectSettings/EditorBuildSettings.asset" ]; then SCENE=$(grep -m1 "path:" "ProjectSettings/EditorBuildSettings.asset" 2>/dev/null \ | sed 's|.*path: ||;s|\.unity.*||;s|.*/||' || echo "unknown") fi N_FILES=$(git diff --cached --name-only | wc -l | tr -d ' ') MSG="auto: $(date +'%Y-%m-%d %H:%M') · scene: ${SCENE:-unknown} · ${N_FILES} files" git commit -m "$MSG" 2>&1 | tee -a "$LOG_FILE" if git push origin main 2>&1 | tee -a "$LOG_FILE"; then log "✅ push 완료: $MSG" exit 0 else log "❌ push 실패 — 로컬 commit 유지, 네트워크/원격 확인 필요" exit 9 fi ;; status) log "▶️ status" git status --short 2>&1 | tee -a "$LOG_FILE" echo "--- 최근 3개 commit ---" | tee -a "$LOG_FILE" git log -3 --oneline 2>&1 | tee -a "$LOG_FILE" exit 0 ;; *) cat <&2 Usage: unity_auto_sync.sh {init|pull|push|status} Actions: init — git 레포 초기화 + remote 설정 (.gitignore/.gitattributes는 사전 배치) pull — fetch + ff-only merge (충돌 시 중단) push — add + commit(자동 메시지) + push status — 작업 트리 상태 + 최근 3개 commit Prerequisite: paths.local.json 의 UNITY_PROJECT_ROOT · UNITY_GIT_REMOTE 설정 필수 EOF exit 1 ;; esac