diff --git a/scripts/git_fetch_throttle.sh b/scripts/git_fetch_throttle.sh index 2a741f0..89d083b 100644 --- a/scripts/git_fetch_throttle.sh +++ b/scripts/git_fetch_throttle.sh @@ -1,23 +1,25 @@ #!/bin/bash -# UserPromptSubmit hook용 5분 throttle된 git fetch + 변경 알림 -# C20-7·C18 운용: 부서 세션이 매 입력 시 5분 이내 main 변경 자동 감지 -# 적용 시점: 2026-04-15 PD님 B안 승인 (Phase 2) +# UserPromptSubmit hook — 실시간 원격 동기화 (2026-04-17 강화) +# 변경 이력: +# - 2026-04-15: 5분 throttle fetch + ff-only merge (초기) +# - 2026-04-17: throttle 30초로 단축 + 자동 stash/pop + merge 강화 +# (PD님 지시: "항상 실시간으로 공유되어서 다른 세션에서도 확인") THROTTLE_DIR="$HOME/.claude/.nerdnavis_throttle" mkdir -p "$THROTTLE_DIR" 2>/dev/null GIT_DIR=$(git rev-parse --git-dir 2>/dev/null) -[ -z "$GIT_DIR" ] && exit 0 # git 레포 아님 — 조용히 종료 +[ -z "$GIT_DIR" ] && exit 0 REPO_HASH=$(echo "$GIT_DIR" | sha1sum 2>/dev/null | cut -d' ' -f1) THROTTLE_FILE="$THROTTLE_DIR/last_fetch_$REPO_HASH" -THROTTLE_SECONDS=300 # 5분 +THROTTLE_SECONDS=30 # 2026-04-17: 300 → 30초 (실시간 동기화 보장) if [ -f "$THROTTLE_FILE" ]; then LAST=$(cat "$THROTTLE_FILE" 2>/dev/null || echo 0) NOW=$(date +%s) if [ $((NOW - LAST)) -lt $THROTTLE_SECONDS ]; then - exit 0 # throttle 적용 + exit 0 fi fi @@ -28,11 +30,32 @@ CHANGES=$(git log --oneline HEAD..origin/main 2>/dev/null | head -5) if [ -n "$CHANGES" ]; then echo "📌 [auto-sync] origin/main 변경 검출:" echo "$CHANGES" - git merge origin/main --no-edit --ff-only 2>/dev/null - if [ $? -eq 0 ]; then - echo "✅ 자동 동기화 완료 (ff-only)" + + # 로컬 미커밋 변경 자동 stash (conflict 회피) + STASHED=0 + if ! git diff --quiet 2>/dev/null || ! git diff --cached --quiet 2>/dev/null; then + if git stash push -u -m "auto-sync-$(date +%s)" > /dev/null 2>&1; then + STASHED=1 + fi + fi + + # ff-only 시도 → 실패 시 일반 merge (non-ff) 시도 + if git merge origin/main --no-edit --ff-only 2>/dev/null; then + echo "✅ 실시간 동기화 완료 (fast-forward)" + elif git merge origin/main --no-edit 2>/dev/null; then + echo "✅ 실시간 동기화 완료 (merge commit)" else - echo "⚠️ 자동 merge 불가 — 세션 갱신으로 수동 해결 필요" + echo "⚠️ 자동 merge 실패 — 수동 해결 필요 (git merge origin/main)" + git merge --abort 2>/dev/null + fi + + # stash 복원 + if [ "$STASHED" -eq 1 ]; then + if git stash pop > /dev/null 2>&1; then + : + else + echo "⚠️ stash pop 실패 — 수동 복원 필요 (git stash list 확인)" + fi fi fi @@ -40,7 +63,6 @@ fi REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) if [ -n "$REPO_ROOT" ]; then INBOX_HASH_FILE="$THROTTLE_DIR/inbox_hash_$REPO_HASH" - # 현재 부서 판별 (PWD 기준) CURRENT_DIR=$(pwd) INBOX_DIRS="" case "$CURRENT_DIR" in