#!/bin/bash # git操作发布脚本 # 参数1: 远程仓库URL # 参数2: 工作目录 # 确保提供了必要的参数 if [ $# -lt 2 ]; then echo "错误:缺少必要参数" echo "用法:$0 <远程仓库URL> <工作目录>" exit 1 fi REMOTE_REPO="$1" WORK_DIR="$2" # 获取版本号 echo "正在获取版本号..." # 返回proto根目录获取version.txt ROOT_DIR=$(dirname "$(dirname "$0")") NEW_VERSION=$(cat "$ROOT_DIR/version.txt") NEW_TAG="v$NEW_VERSION" echo "使用的版本号: $NEW_TAG" # 创建临时目录用于克隆仓库 TEMP_DIR=$(mktemp -d) echo "创建临时目录: $TEMP_DIR" # 清理函数,确保临时目录被删除 trap "rm -rf \"$TEMP_DIR\"" EXIT # 1. 在临时目录克隆远程仓库,只获取.git目录 echo "在临时目录克隆远程仓库..." git clone --no-checkout "$REMOTE_REPO" "$TEMP_DIR" # 2. 确保工作目录存在 if [ ! -d "$WORK_DIR" ]; then echo "创建工作目录: $WORK_DIR" mkdir -p "$WORK_DIR" fi # 3. 复制.git目录到工作目录 # 先删除工作目录中可能存在的.git目录 if [ -d "$WORK_DIR/.git" ]; then echo "删除工作目录中已有的.git目录..." rm -rf "$WORK_DIR/.git" fi echo "将.git目录复制到工作目录..." cp -a "$TEMP_DIR/.git" "$WORK_DIR/" # 4. 切换到工作目录 cd "$WORK_DIR" # 5. 添加所有文件 echo "添加文件..." git add . # 6. 检查是否有更改需要提交 if ! git diff --cached --exit-code > /dev/null; then echo "提交更改..." git commit -m "自动生成 protobuf 代码 (tag: $NEW_TAG)" else echo "没有更改需要提交,创建空提交..." git commit --allow-empty -m "自动生成 protobuf 代码 (tag: $NEW_TAG)" fi # 7. 如果标签已存在,先删除 if git rev-parse --verify "$NEW_TAG" > /dev/null 2>&1; then echo "标签 $NEW_TAG 已存在,先删除..." git tag -d "$NEW_TAG" # 同时删除远程标签 git push origin :refs/tags/"$NEW_TAG" fi # 8. 创建新标签 echo "创建标签..." git tag "$NEW_TAG" # 9. 推送标签和分支 echo "推送标签和分支..." # 先推送标签 git push origin "$NEW_TAG" if [ $? -ne 0 ]; then echo "错误:标签推送失败" exit 1 fi # 再推送分支 git push origin main if [ $? -ne 0 ]; then echo "警告:分支推送失败,请检查远程仓库状态" echo "标签 $NEW_TAG 已成功发布到仓库 $REMOTE_REPO" else echo "成功发布版本 $NEW_TAG 和分支到仓库 $REMOTE_REPO" fi