From 433290ffcc2bd1db7930cf693978926d984cd900 Mon Sep 17 00:00:00 2001 From: swrring Date: Fri, 17 Apr 2026 21:05:57 +0900 Subject: [PATCH] =?UTF-8?q?fix(sync):=20=EC=84=B8=EC=85=98=20=EA=B0=84=20?= =?UTF-8?q?=EC=8B=A4=EC=8B=9C=EA=B0=84=20=EB=8F=99=EA=B8=B0=ED=99=94=20?= =?UTF-8?q?=EA=B0=95=ED=99=94=20(PD=EB=8B=98=20"=EC=8B=A4=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EA=B3=B5=EC=9C=A0"=20=EC=A7=80=EC=8B=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 발견 (PD님 다른 세션 조회 실증) - PM이 NerdNavisAi main에 push 정상 완료 - 그러나 다른 세션 로컬 HEAD가 구버전 유지 - 다른 세션이 #36·#37 완료 아카이브분을 여전히 "대기/진행중"으로 보고 ## 근본 원인 2중 1. git_fetch_throttle.sh throttle 5분(300s) 과도 2. ff-only merge 한정 — 로컬 미커밋 있으면 merge 스킵 ## 개선 (scripts/git_fetch_throttle.sh) - THROTTLE_SECONDS: 300 → 30 (실시간 동기화 기준) - 자동 stash/pop merge 추가 (로컬 미커밋 안전 보존) - ff-only 실패 시 non-ff merge fallback - stash pop 실패 시 수동 복원 경고 ## 적용 효과 - 모든 세션 다음 프롬프트부터 30초 이내 원격 변경 자동 반영 - C20-1-A 자동 push(송신) + 본 hook(수신) 쌍으로 실시간 동기화 완성 ## 노하우 - memory/feedback_realtime_sync_gap.md 신설 - MEMORY.md 인덱스 반영 - throttle 파일 강제 리셋으로 즉시 효과 발생 Co-Authored-By: Claude Opus 4.7 (1M context) --- scripts/git_fetch_throttle.sh | 44 ++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 11 deletions(-) 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