#!/bin/bash # =================================================================== # push_audio.sh # 仅提交并推送 *.tscn 音效改动到 audio 分支,其它改动会被永久丢弃! # =================================================================== # ⚠️ 警告:脚本执行后,非 *.tscn 的本地修改将被 # ⚠️ git reset --hard + git clean -fd # ⚠️ 彻底删除且无法找回,请确认没有要保留的改动! # ------------------------------------------------------------------- set -euo pipefail IFS=$'\n\t' REMOTE=origin BRANCH=audio ## ------------------------------------------------------------- color() { printf '\033[%sm%s\033[0m\n' "$1" "$2"; } info() { color "1;34" "👉 $*"; } # 蓝 warn() { color "1;33" "⚠️ $*"; } # 黄 die() { color "1;31" "❌ $*"; exit 1; } # 红 ## ------------------------------------------------------------- # 0. 检测 Git、操作系统、确认危险操作 ## ------------------------------------------------------------- command -v git >/dev/null 2>&1 || die "未安装 Git!" git_version=$(git --version | awk '{print $3}') info "Git 版本:$git_version" warn "脚本将丢弃所有非 *.tscn 改动,5 秒内 Ctrl-C 可取消" sleep 5 ## ------------------------------------------------------------- # 1. 认证检查(HTTP/S 及 SSH 两种) ## ------------------------------------------------------------- info "检查 Git 认证状态..." remote_url=$(git remote get-url "$REMOTE" 2>/dev/null) \ || die "远程 $REMOTE 不存在,请先 git remote add" if [[ "$remote_url" =~ ^https?:// ]]; then if ! git ls-remote "$REMOTE" &>/dev/null; then die "HTTP(S) 鉴权失败,请先完成登录或配置 token 再执行脚本" fi info "HTTP(S) 鉴权通过" else # SSH:检测是否有可用密钥 if ! ssh -Tq "$(echo "$remote_url" | sed 's#.*@##;s/:.*##')" 2>&1 \ | grep -qi "successfully authenticated"; then warn "SSH 连接测试结果不确定,若后续 push 失败请检查 SSH key" fi fi ## ------------------------------------------------------------- # 2. 切换到 audio 分支 ## ------------------------------------------------------------- current_branch=$(git rev-parse --abbrev-ref HEAD) if [[ "$current_branch" != "$BRANCH" ]]; then info "切换分支 $current_branch → $BRANCH ..." git switch "$BRANCH" 2>/dev/null || git checkout "$BRANCH" \ || die "切换失败,请确认分支 $BRANCH 存在" fi ## ------------------------------------------------------------- # 3. 仅暂存 / 提交 *.tscn 改动 ## ------------------------------------------------------------- info "检测 *.tscn 改动..." # 取消任何已暂存的内容,保持工作区状态不变 git reset --quiet # 标记并暂存 tscn 文件(包括新增) git add -u -- '*.tscn' 2>/dev/null || true git add --intent-to-add -- '*.tscn' 2>/dev/null || true git add -- '*.tscn' 2>/dev/null || true if git diff --cached --quiet; then info "没有需要提交的 tscn 改动" else msg="调整音效 dB – $(date '+%F %H:%M')" git commit -m "$msg" info "已提交:$msg" fi ## ------------------------------------------------------------- # 4. 丢弃其它改动 ## ------------------------------------------------------------- info "丢弃非 *.tscn 的本地改动..." git reset --hard # 回到 HEAD git clean -fdq # 删除未跟踪文件/目录 ## ------------------------------------------------------------- # 5. 拉取远程最新并 rebase ## ------------------------------------------------------------- info "拉取远程最新并 rebase..." if ! git pull --rebase "$REMOTE" "$BRANCH"; then die "rebase 冲突,请手动解决完毕后运行:\n git rebase --continue\n再重新执行脚本" fi ## ------------------------------------------------------------- # 6. 推送 ## ------------------------------------------------------------- info "推送到 $REMOTE/$BRANCH ..." git push "$REMOTE" "$BRANCH" || die "推送失败,请检查网络/权限" color "1;32" "✅ tscn 改动已成功推送,其余改动已被抛弃"