fix(sync): 세션 간 실시간 동기화 강화 (PD님 "실시간 공유" 지시)
## 발견 (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) <noreply@anthropic.com>
This commit is contained in:
parent
96b1fd7831
commit
433290ffcc
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue