166 lines
5.8 KiB
Bash
166 lines
5.8 KiB
Bash
#!/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 <<EOF >&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
|