#!/usr/bin/env bash # 배포 서버에서 런타임 data 파일의 **로컬 수정** 때문에 # "Your local changes to the following files would be overwritten by merge" 가 나와 # git pull 이 막힐 때 사용합니다. # 동작: 지정 경로를 백업 → 인덱스/작업트리를 리셃해 pull을 허용 → 백업을 다시 복사합니다. set -euo pipefail REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" cd "$REPO_ROOT" # pull 전에 Git이 덮어쓰기를 거부하는 런타임 전용 경로(필요 시 추가) PULL_SAFE_PATHS=( "data/ai-success-stories.json" ) STAMP="$(date +%Y%m%d%H%M%S)" BAK_DIR="${REPO_ROOT}/.tmp-safe-pull-backup-${STAMP}" mkdir -p "$BAK_DIR" backed=() for relpath in "${PULL_SAFE_PATHS[@]}"; do if [[ -f "$relpath" ]]; then dest="${BAK_DIR}/$(echo "$relpath" | tr / _)" cp -a "$relpath" "$dest" backed+=("$relpath|$dest") fi done # 추적 중이면 머지/체크아웃이 막힘 — 먼저 백업했으므로 작업트리·스테이징만 맞춤 for relpath in "${PULL_SAFE_PATHS[@]}"; do if git ls-files --error-unmatch -- "$relpath" >/dev/null 2>&1; then if ! git restore --worktree --staged -- "$relpath" 2>/dev/null; then git reset -q HEAD -- "$relpath" 2>/dev/null || true git checkout -- "$relpath" 2>/dev/null || true fi fi done git pull "$@" for ent in "${backed[@]}"; do relpath="${ent%%|*}" src="${ent#*|}" if [[ -f "$src" ]]; then cp -a "$src" "$relpath" fi done rm -rf "$BAK_DIR" echo "safe-git-pull: 완료. 런타임 파일은 백업에서 복원되었습니다."