滚动更新新增 Git 访问方式选择(HTTPS/SSH)及工作区变更预检
- install.sh: - 滚动更新流程新增「选择 Git 访问方式」步骤(HTTPS 登录 / SSH 访问) - SSH 方式支持指定私钥文件路径或粘贴私钥内容(临时文件用后即删) - 仓库地址输入回填当前 remote(同协议时)作为默认值 - 选环境后立即检测工作区变更,提供暂存/放弃/取消处理 - 更新结束后按 HEAD 是否变化决定自动恢复暂存或提示手动恢复 - scripts/update.sh: - 新增 --ssh-key 参数,SSH 协议下通过 GIT_SSH_COMMAND -i 指定私钥 - 新增 --skip-dirty-check 参数,供 install.sh 预检后透传 - scripts/common.sh: - ctms_ask_line 提示语改输出到 stderr,避免被命令替换吞掉 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+24
-1
@@ -9,8 +9,10 @@ source "$SCRIPT_DIR/common.sh"
|
||||
TARGET_ENV=""
|
||||
REPO_URL=""
|
||||
GIT_BRANCH=""
|
||||
SSH_KEY=""
|
||||
ASSUME_YES=0
|
||||
SKIP_BACKUP=0
|
||||
SKIP_DIRTY_CHECK=0
|
||||
FORCE_PULL=0
|
||||
INSTALL_ARGS=()
|
||||
|
||||
@@ -55,8 +57,11 @@ ${C_BOLD}选项:${C_RESET}
|
||||
${C_WHITE}--repo-url <url>${C_RESET} Git 仓库地址(HTTPS 或 SSH)
|
||||
不指定时会提示输入或使用当前远程地址
|
||||
${C_WHITE}--branch <name>${C_RESET} 指定拉取的分支(默认为当前分支)
|
||||
${C_WHITE}--ssh-key <path>${C_RESET} SSH 私钥文件路径(仅 SSH 仓库地址时生效)
|
||||
不指定时使用本机默认 SSH 配置(~/.ssh/)
|
||||
${C_WHITE}--yes${C_RESET} 跳过所有交互确认,适合 CI/CD 自动化执行
|
||||
${C_WHITE}--skip-backup${C_RESET} 跳过更新前自动备份 tag(不推荐)
|
||||
${C_WHITE}--skip-dirty-check${C_RESET} 跳过工作目录变更检测(由 install.sh 预检后透传)
|
||||
${C_WHITE}--force${C_RESET} 强制覆盖本地更改(git reset --hard)
|
||||
${C_WHITE}-h, --help${C_RESET} 显示此帮助信息
|
||||
|
||||
@@ -121,8 +126,14 @@ parse_args() {
|
||||
GIT_BRANCH="$2"
|
||||
shift 2
|
||||
;;
|
||||
--ssh-key)
|
||||
[[ $# -ge 2 ]] || ctms_fail "--ssh-key 需要提供私钥文件路径"
|
||||
SSH_KEY="$2"
|
||||
shift 2
|
||||
;;
|
||||
--yes) ASSUME_YES=1; shift ;;
|
||||
--skip-backup) SKIP_BACKUP=1; shift ;;
|
||||
--skip-dirty-check) SKIP_DIRTY_CHECK=1; shift ;;
|
||||
--force) FORCE_PULL=1; shift ;;
|
||||
-h|--help) usage; exit 0 ;;
|
||||
--skip-build|--skip-migrate|--verbose|--base-url)
|
||||
@@ -200,6 +211,10 @@ verify_project_identity() {
|
||||
|
||||
# ── 工作目录状态检查 ─────────────────────────
|
||||
check_working_directory() {
|
||||
if [[ "$SKIP_DIRTY_CHECK" -eq 1 ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
ctms_step "检查工作目录状态"
|
||||
|
||||
if [[ "$FORCE_PULL" -eq 1 ]]; then
|
||||
@@ -363,7 +378,14 @@ pick_remote_ref() {
|
||||
setup_git_credentials() {
|
||||
# SSH 协议不需要额外配置
|
||||
if [[ "$REPO_URL" =~ ^(git@|ssh://) ]]; then
|
||||
ctms_info "使用 SSH 协议,跳过凭证配置"
|
||||
if [[ -n "$SSH_KEY" ]]; then
|
||||
[[ -f "$SSH_KEY" ]] || ctms_fail "指定的 SSH 私钥文件不存在: $SSH_KEY"
|
||||
# 通过 GIT_SSH_COMMAND 指定私钥;IdentitiesOnly 确保只用这把钥匙
|
||||
export GIT_SSH_COMMAND="ssh -i '$SSH_KEY' -o IdentitiesOnly=yes"
|
||||
ctms_info "使用 SSH 协议,已指定私钥: $SSH_KEY"
|
||||
else
|
||||
ctms_info "使用 SSH 协议,使用本机默认 SSH 配置"
|
||||
fi
|
||||
return 0
|
||||
fi
|
||||
|
||||
@@ -415,6 +437,7 @@ cleanup_git_credentials() {
|
||||
rm -f "$GIT_ASKPASS" 2>/dev/null || true
|
||||
fi
|
||||
unset GIT_ASKPASS GIT_ASKPASS_USERNAME GIT_ASKPASS_PASSWORD
|
||||
unset GIT_SSH_COMMAND
|
||||
}
|
||||
|
||||
# ── 备份当前版本 ─────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user