DOCS/workflow/local_developer_workflow.md

4.2 KiB

type, tags, last_updated
type tags last_updated
workflow
infra
workflow
local
git
sync
developer
cli
2026-03-23

로컬 개발자 워크플로우

상위 원칙

관련 문서

목적

  • 로컬 PC(워크스페이스 루트)에서 전체 레포 동기화·푸시·상태 확인을 같은 순서로 수행합니다.
  • 사람과 에이전트가 같은 문서를 읽고 같은 기준으로 로컬 작업을 수행합니다.

적용 범위

  • 전체 레포 git pull
  • 작업 전/후 git status 확인
  • 변경·미추적 파일 add·커밋·푸시 (레포 단위)

기본 원칙

  • 워크스페이스 루트는 환경마다 다릅니다. 로컬 PC의 경우 예: $HOME/projects 또는 $WORKSPACE_ROOT.
  • 스크립트·경로는 $WORKSPACE_ROOT 기준 상대 경로로 해석합니다.
  • 교차 저장소 단일 커밋 금지. 각 레포별로 add·커밋·푸시합니다.
  • 커밋 범위: 사용자 지시가 없는 한, 기존 미커밋 변경은 내 작업과 함께 커밋하지 않습니다. 사용자가 "푸시해 모두" 등으로 명시 지시한 경우에만 해당 레포 내 변경 전부를 add·커밋·푸시 대상에 포함합니다.
  • workspace-config 경계: runtime.env, secrets.env는 공용 기준(구조·키·역할)의 SSOT입니다. 실제 값 파일은 .gitignore·비추적·로컬 오버라이드 전용이며, 커밋 대상에 포함하지 않습니다.

표준 흐름

1. 전체 레포 pull

"깃풀해줘" 요청 시 또는 작업 시작 전 동기화:

# $WORKSPACE_ROOT/scripts/git_pull_all.sh 실행
# 기본값: /home/happybell/projects (로컬 PC)
"$WORKSPACE_ROOT/scripts/git_pull_all.sh"
# 또는
"$WORKSPACE_ROOT/scripts/git_pull_all.sh" "$WORKSPACE_ROOT"

판단 기준:

  • pull 성공: N개 출력
  • 실패 시 해당 레포만 수동 확인 후 재시도

2. 작업 전 상태 확인

cd "$WORKSPACE_ROOT"
find . -name ".git" -type d -not -path "./trash_*" 2>/dev/null | while read d; do
  dir=$(dirname "$d")
  out=$(cd "$dir" && git status -sb 2>/dev/null)
  if echo "$out" | grep -qE '\[(ahead|behind)\]|^ M|^M |^\?\?'; then
    echo "=== $dir ==="; (cd "$dir" && git status --short)
  fi
done

3. 작업 종료 전 정리

각 변경된 레포에서 (사용자 명시 지시가 있는 경우에만 해당 레포 내 변경 전부 포함):

cd "$REPO_PATH"
git add -A
git status   # 확인
git commit -m "적절한 메시지"
git push
  • push reject 시: git pull --rebasegit push 재시도.
  • 미커밋 상태가 남으면 이유(보류/폐기/후속작업)를 명시합니다.
  • "완료" 보고는 커밋 해시/푸시 브랜치 기준으로만 합니다.

4. 스크립트 위치

스크립트 경로 용도
git_pull_all.sh $WORKSPACE_ROOT/scripts/git_pull_all.sh 전체 레포 일괄 동기화 전용
  • 주의: 이 스크립트는 --no-rebase로 동작합니다. 일괄 pull에만 쓰고, 개별 레포의 기본 pull 전략으로 삼지 않습니다. push reject 시에는 해당 레포에서 pull --rebase 후 push.
  • 스크립트가 없으면 scripts/ 폴더에 생성 후 실행 권한 부여합니다.

참고

  • projects 루트는 Git 레포가 아닐 수 있습니다. 실제 하위 레포를 식별해 처리합니다.
  • trash_* 폴더는 검색에서 제외합니다.