diff --git a/scripts/update.sh b/scripts/update.sh index 1feaf186..0cee0001 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -14,6 +14,7 @@ ASSUME_YES=0 SKIP_BACKUP=0 SKIP_DIRTY_CHECK=0 FORCE_PULL=0 +BOOTSTRAP_GIT_REPO=0 INSTALL_ARGS=() # 项目身份验证标识文件(至少需要其中 2 个) @@ -158,8 +159,22 @@ check_git_installed() { command -v git >/dev/null 2>&1 || ctms_fail "未检测到 git 命令,请先安装 Git" } -check_is_git_repo() { - git rev-parse --git-dir >/dev/null 2>&1 || ctms_fail "当前目录不是 Git 仓库" +detect_git_repository() { + if git rev-parse --git-dir >/dev/null 2>&1 && git rev-parse --verify HEAD >/dev/null 2>&1; then + BOOTSTRAP_GIT_REPO=0 + else + BOOTSTRAP_GIT_REPO=1 + fi +} + +initialize_git_repository() { + [[ "$BOOTSTRAP_GIT_REPO" -eq 1 ]] || return 0 + + ctms_step "接管现有部署目录" + if [[ ! -d "$CTMS_ROOT_DIR/.git" ]]; then + git init "$CTMS_ROOT_DIR" >/dev/null 2>&1 || ctms_fail "初始化 Git 仓库失败" + fi + ctms_ok "已初始化 Git 仓库,准备同步远程代码" } get_current_branch() { @@ -568,8 +583,14 @@ main() { cd "$CTMS_ROOT_DIR" check_git_installed - check_is_git_repo - check_working_directory + detect_git_repository + if [[ "$BOOTSTRAP_GIT_REPO" -eq 1 ]]; then + ctms_warn "部署目录缺少可用的 Git 历史,将从指定仓库接管现有部署" + # 必须先确认这是 CTMS 目录,避免在任意目录中初始化并覆盖文件。 + verify_project_identity + else + check_working_directory + fi resolve_repo_url setup_git_credentials pick_remote_ref @@ -577,6 +598,7 @@ main() { # 先验证当前项目身份 verify_project_identity + initialize_git_repository # 创建备份 create_backup_tag