iBetter Books
수정

브랜치별 자동 빌드

git checkout develop을 실행하는 순간, 자동으로 개발 환경 설정이 로드되고 의존성 패키지가 최신 상태로 갱신되면 어떨까요. 브랜치를 바꿀 때마다 수동으로 .env 파일을 교체하거나 npm install을 실행하는 번거로움이 사라집니다.

post-checkoutpost-merge Hook으로 이를 구현합니다.

post-checkout Hook

git checkout 또는 git switch 실행이 완료된 직후 실행됩니다. 세 가지 인수를 받습니다.

# post-checkout 인수$1  # 이전 HEAD 커밋 해시$2  # 새 HEAD 커밋 해시$3  # 브랜치 전환이면 1, 파일 복원이면 0

$3이 0이면 파일 복원(git checkout -- file)이고, 1이면 브랜치 전환입니다. 브랜치 전환일 때만 자동 설정을 실행하면 됩니다.

브랜치명에 따른 환경 분리

일반적인 Git 브랜치 전략에서 환경을 분리합니다.

브랜치 패턴 환경 .env 파일
main, master 프로덕션 .env.prod
develop 개발 .env.dev
feature/* 테스트 .env.test
hotfix/* 프로덕션 .env.prod
그 외 기본 .env.dev

.env 파일 자동 전환 스크립트

# 새 파일: .git/hooks/post-checkout#!/bin/bash# post-checkout: 브랜치 전환 시 환경 설정 자동 전환PREV_HEAD=$1NEW_HEAD=$2BRANCH_SWITCH=$3# 파일 복원 시에는 실행하지 않음if [ "$BRANCH_SWITCH" -ne 1 ]; then    exit 0fi# 현재 브랜치명 확인CURRENT_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null || echo "detached")PROJECT_ROOT=$(git rev-parse --show-toplevel)# 컬러 출력CYAN='\033[0;36m'GREEN='\033[0;32m'YELLOW='\033[1;33m'NC='\033[0m'echo ""echo -e "${CYAN}브랜치 전환 감지: ${CURRENT_BRANCH}${NC}"# ─── 환경 결정 ────────────────────────────────────────────────────────────────determine_env() {    local branch=$1    case "$branch" in        main|master)            echo "prod"            ;;        develop)            echo "dev"            ;;        feature/*|test/*)            echo "test"            ;;        hotfix/*|release/*)            echo "prod"            ;;        *)            echo "dev"            ;;    esac}ENV=$(determine_env "$CURRENT_BRANCH")ENV_FILE="$PROJECT_ROOT/.env.$ENV"TARGET_FILE="$PROJECT_ROOT/.env"# ─── .env 파일 전환 ───────────────────────────────────────────────────────────if [ -f "$ENV_FILE" ]; then    cp "$ENV_FILE" "$TARGET_FILE"    echo -e "${GREEN}  환경 설정 전환: .env.$ENV → .env${NC}"else    echo -e "${YELLOW}  경고: $ENV_FILE 파일이 없습니다. .env를 그대로 유지합니다.${NC}"fi# ─── 의존성 자동 설치 ─────────────────────────────────────────────────────────auto_install_deps() {    local root=$1    # Node.js 프로젝트 (package.json 있을 때)    if [ -f "$root/package.json" ]; then        # package-lock.json이 변경되었을 때만 npm install 실행        if git diff --name-only "$PREV_HEAD" "$NEW_HEAD" 2>/dev/null | grep -q "package-lock.json"; then            echo "  package-lock.json 변경 감지 — npm install 실행 중..."            (cd "$root" && npm install --silent 2>&1 | tail -3)            echo -e "${GREEN}  npm install 완료${NC}"        fi    fi    # Python 프로젝트 (requirements.txt 있을 때)    if [ -f "$root/requirements.txt" ]; then        if git diff --name-only "$PREV_HEAD" "$NEW_HEAD" 2>/dev/null | grep -q "requirements.txt"; then            echo "  requirements.txt 변경 감지 — pip install 실행 중..."            if [ -f "$root/.venv/bin/pip" ]; then                "$root/.venv/bin/pip" install -r "$root/requirements.txt" -q            else                pip install -r "$root/requirements.txt" -q 2>/dev/null || true            fi            echo -e "${GREEN}  pip install 완료${NC}"        fi    fi}auto_install_deps "$PROJECT_ROOT"echo -e "${GREEN}환경 설정 완료 (환경: $ENV)${NC}"echo ""exit 0
# 실행 권한 부여chmod +x .git/hooks/post-checkout

post-merge Hook

git merge 또는 git pull 완료 후 실행됩니다. 브랜치를 병합하면 의존성 파일이 바뀔 수 있으니 자동으로 패키지를 갱신합니다.

# 새 파일: .git/hooks/post-merge#!/bin/bash# post-merge: 병합 후 의존성 자동 갱신PROJECT_ROOT=$(git rev-parse --show-toplevel)GREEN='\033[0;32m'NC='\033[0m'echo ""echo "병합 완료 후 의존성 확인 중..."# 병합으로 변경된 파일 목록 확인CHANGED_FILES=$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD 2>/dev/null || true)# Node.js 의존성 갱신if echo "$CHANGED_FILES" | grep -q "package-lock.json"; then    echo "  package-lock.json 변경 감지 — npm install 실행 중..."    (cd "$PROJECT_ROOT" && npm install --silent 2>&1 | tail -3)    echo -e "${GREEN}  npm install 완료${NC}"fi# Python 의존성 갱신if echo "$CHANGED_FILES" | grep -q "requirements.txt"; then    echo "  requirements.txt 변경 감지 — pip install 실행 중..."    if [ -f "$PROJECT_ROOT/.venv/bin/pip" ]; then        "$PROJECT_ROOT/.venv/bin/pip" install -r "$PROJECT_ROOT/requirements.txt" -q    fi    echo -e "${GREEN}  pip install 완료${NC}"fiecho ""exit 0
chmod +x .git/hooks/post-merge

실습: 브랜치 전환 테스트

# 실습 환경 준비mkdir ~/branch-test && cd ~/branch-testgit init# 환경별 .env 파일 생성cat > .env.dev << 'EOF'APP_ENV=developmentDB_HOST=localhostDB_PORT=5432DB_NAME=myapp_devDEBUG=trueAPI_URL=http://localhost:3000EOFcat > .env.prod << 'EOF'APP_ENV=productionDB_HOST=db.myapp.comDB_PORT=5432DB_NAME=myapp_prodDEBUG=falseAPI_URL=https://api.myapp.comEOFcat > .env.test << 'EOF'APP_ENV=testDB_HOST=localhostDB_PORT=5432DB_NAME=myapp_testDEBUG=trueAPI_URL=http://localhost:4000EOF# 초기 커밋git add .env.dev .env.prod .env.testgit commit -m "add env files"# Hook 설치 후 브랜치 전환git checkout -b develop
브랜치 전환 감지: develop
  환경 설정 전환: .env.dev → .env
환경 설정 완료 (환경: dev)
# 현재 .env 내용 확인cat .env
APP_ENV=development
DB_HOST=localhost
...
# feature 브랜치로 전환git checkout -b feature/login
브랜치 전환 감지: feature/login
  환경 설정 전환: .env.test → .env
환경 설정 완료 (환경: test)

브랜치를 전환하는 순간 .env가 자동으로 교체됩니다.

주의사항

.env 파일에는 데이터베이스 비밀번호, API 키 같은 민감 정보가 담길 수 있습니다. .env.* 파일은 반드시 .gitignore에 추가해야 합니다.

# .gitignore에 추가echo ".env" >> .gitignoreecho ".env.*" >> .gitignore

Hook 스크립트 자체는 scripts/hooks/ 같은 별도 디렉토리에 Git으로 관리하고, 실제 .env.* 파일은 팀 내부 비밀 관리 도구(Vault, AWS Secrets Manager 등)나 암호화된 채널로 공유합니다.