Deploy: GitHub submodule sync 2026-07-23 12:46:52
This commit is contained in:
Executable
+164
@@ -0,0 +1,164 @@
|
||||
#!/usr/bin/env bash
|
||||
# GitHub upstream → monorepo submodule 최신 소스 반영 (pull only, push 없음)
|
||||
#
|
||||
# ./git_fetch_all.sh # 4개 submodule fetch + fast-forward
|
||||
# ./git_fetch_all.sh --init # submodule 미초기화 시 clone 포함
|
||||
# ./git_fetch_all.sh --dry-run # 실행 없이 변경 예상만 출력
|
||||
#
|
||||
# 대상 (.gitmodules):
|
||||
# chatbotApp-chatbot2.0-agent → KoreaExpressWayCorp/chatbotApp (chatbot2.0-agent)
|
||||
# chatbotApi-chatbot2.0-agent → KoreaExpressWayCorp/chatbotApi (chatbot2.0-agent)
|
||||
# exAiChatBot-chatbot2.0-agent → KoreaExpressWayCorp/exAiChatBot (chatbot2.0-agent)
|
||||
# kakaoChatbotSkill-chatbot2.0-agent → KoreaExpressWayCorp/kakaoChatbotSkill (chatbot2.0-agent)
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
INIT=false
|
||||
DRY_RUN=false
|
||||
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
--init) INIT=true ;;
|
||||
--dry-run) DRY_RUN=true ;;
|
||||
-h|--help)
|
||||
sed -n '2,14p' "$0"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "알 수 없는 옵션: $arg (--help)"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
log() { echo "[git_fetch_all] $*"; }
|
||||
warn() { echo "[git_fetch_all] ⚠️ $*" >&2; }
|
||||
|
||||
cd "${ROOT_DIR}"
|
||||
|
||||
if [[ ! -f .gitmodules ]]; then
|
||||
echo "ERROR: .gitmodules 없음 — submodule 미설정"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
SUBMODULE_PATHS=()
|
||||
while IFS= read -r _path; do
|
||||
[[ -n "${_path}" ]] && SUBMODULE_PATHS+=("${_path}")
|
||||
done < <(git config -f .gitmodules --get-regexp '^submodule\..*\.path$' | awk '{print $2}')
|
||||
|
||||
if [[ ${#SUBMODULE_PATHS[@]} -eq 0 ]]; then
|
||||
echo "ERROR: .gitmodules 에 submodule 경로 없음"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if $INIT && ! $DRY_RUN; then
|
||||
log "submodule init..."
|
||||
git submodule update --init --recursive
|
||||
fi
|
||||
|
||||
restore_monorepo_overlays() {
|
||||
if [[ -f "${ROOT_DIR}/local-dev/docker-compose.rag.local.yml" ]]; then
|
||||
cp "${ROOT_DIR}/local-dev/docker-compose.rag.local.yml" \
|
||||
"${ROOT_DIR}/exAiChatBot-chatbot2.0-agent/docker-compose.local.yml"
|
||||
log "복원: exAiChatBot/docker-compose.local.yml (monorepo overlay)"
|
||||
fi
|
||||
if [[ -f "${ROOT_DIR}/server-dev/docker-compose.rag.server.yml" ]]; then
|
||||
cp "${ROOT_DIR}/server-dev/docker-compose.rag.server.yml" \
|
||||
"${ROOT_DIR}/exAiChatBot-chatbot2.0-agent/docker-compose.server.yml"
|
||||
log "복원: exAiChatBot/docker-compose.server.yml (monorepo overlay)"
|
||||
fi
|
||||
}
|
||||
|
||||
fetch_one() {
|
||||
local path="$1"
|
||||
local url branch old new dirty
|
||||
|
||||
url="$(git config -f .gitmodules "submodule.${path}.url")"
|
||||
branch="$(git config -f .gitmodules "submodule.${path}.branch" || echo main)"
|
||||
branch="${branch:-main}"
|
||||
|
||||
log ">>> ${path}"
|
||||
log " url=${url} branch=${branch}"
|
||||
|
||||
if ! git -C "${ROOT_DIR}/${path}" rev-parse --git-dir >/dev/null 2>&1; then
|
||||
if $DRY_RUN; then
|
||||
log " [dry-run] submodule clone 필요 — ./git_fetch_all.sh --init"
|
||||
return 0
|
||||
fi
|
||||
if $INIT; then
|
||||
git submodule update --init "${path}"
|
||||
else
|
||||
warn "${path} — submodule 미초기화. --init 옵션 사용"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
(
|
||||
cd "${ROOT_DIR}/${path}"
|
||||
|
||||
if ! git diff --quiet || ! git diff --cached --quiet; then
|
||||
dirty=yes
|
||||
warn "${path} — 로컬 변경 있음 (fetch는 진행, fast-forward 실패 가능)"
|
||||
else
|
||||
dirty=no
|
||||
fi
|
||||
|
||||
old="$(git rev-parse HEAD 2>/dev/null || echo none)"
|
||||
|
||||
if $DRY_RUN; then
|
||||
git fetch origin "${branch}" 2>/dev/null || git fetch origin
|
||||
new="$(git rev-parse "origin/${branch}" 2>/dev/null || echo unknown)"
|
||||
if [[ "${old}" == "${new}" ]]; then
|
||||
log " [dry-run] 이미 최신: ${old:0:7}"
|
||||
else
|
||||
log " [dry-run] ${old:0:7} → ${new:0:7}"
|
||||
git log --oneline "${old}..origin/${branch}" 2>/dev/null | sed 's/^/ /' || true
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
git fetch origin "${branch}"
|
||||
git checkout "${branch}" 2>/dev/null || git checkout -B "${branch}" "origin/${branch}"
|
||||
|
||||
if git merge-base --is-ancestor HEAD "origin/${branch}" 2>/dev/null \
|
||||
&& [[ "$(git rev-parse HEAD)" != "$(git rev-parse "origin/${branch}")" ]]; then
|
||||
git merge --ff-only "origin/${branch}"
|
||||
elif [[ "$(git rev-parse HEAD)" != "$(git rev-parse "origin/${branch}")" ]]; then
|
||||
warn "${path} — fast-forward 불가 (로컬 커밋/변경 존재). 수동 merge 필요"
|
||||
git status -sb | sed 's/^/ /'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
new="$(git rev-parse HEAD)"
|
||||
if [[ "${old}" == "${new}" ]]; then
|
||||
log " ✅ 최신 유지 $(git log -1 --oneline)"
|
||||
else
|
||||
log " ✅ 갱신 ${old:0:7} → ${new:0:7} $(git log -1 --oneline)"
|
||||
fi
|
||||
)
|
||||
}
|
||||
|
||||
failures=0
|
||||
for path in "${SUBMODULE_PATHS[@]}"; do
|
||||
if ! fetch_one "${path}"; then
|
||||
failures=$((failures + 1))
|
||||
fi
|
||||
echo ""
|
||||
done
|
||||
|
||||
if ! $DRY_RUN; then
|
||||
restore_monorepo_overlays
|
||||
fi
|
||||
|
||||
log "=========================================="
|
||||
log "submodule 상태:"
|
||||
git submodule status || true
|
||||
log "=========================================="
|
||||
|
||||
if [[ ${failures} -gt 0 ]]; then
|
||||
warn "실패 ${failures}개 — 로그 확인"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
log "완료 — GitHub → 로컬 반영 (push 없음)"
|
||||
log "monorepo 커밋 갱신: git add .gitmodules *-chatbot2.0-agent && git status"
|
||||
Reference in New Issue
Block a user