Files
proto/script/publish-git.sh
2025-08-20 22:37:07 +08:00

97 lines
2.4 KiB
Bash
Executable File

#!/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