1. 调用函数 → 查出模块标签 + 标签绑定提交Commit哈希
2. 判定标签/Commit为空直接跳过 3. 合并命令: git checkout origin/模块名 commit哈希:模块文件夹 4. 仅添加当前模块目录,精准提交 5. 提交日志同时记录标签名+提交哈希,方便回溯
This commit is contained in:
@@ -1,37 +1,34 @@
|
||||
#!/system/bin/sh
|
||||
## 合并远程指定版本标签下模块文件夹到本地 projects_keeper_tag 分支
|
||||
## 合并远程模块指定标签对应提交点文件夹到本地 projects_keeper_tag 分支
|
||||
|
||||
# ====================== 获取模块对应远程版本标签 ======================
|
||||
get_module_latest_tag() {
|
||||
# ====================== 获取模块标签与对应Commit ======================
|
||||
get_module_tag_commit() {
|
||||
local module_dir="$1"
|
||||
local remote_branch="origin/${module_dir}"
|
||||
|
||||
# 强制拉取远程分支+全部远程标签到本地
|
||||
git fetch origin "$module_dir"
|
||||
git fetch origin --tags
|
||||
git fetch origin "$module_dir" 2>/dev/null
|
||||
git fetch origin --tags 2>/dev/null
|
||||
|
||||
# 获取远程分支最新提交哈希
|
||||
# 获取远程分支最新commit
|
||||
local latest_commit
|
||||
latest_commit=$(git log -1 --pretty=format:%H "$remote_branch" 2>/dev/null)
|
||||
|
||||
# 调试信息输出到错误流,不污染返回值
|
||||
echo " 调试:模块[$module_dir] 远程最新Commit = $latest_commit" >&2
|
||||
echo " 调试:模块[$module_dir] 远程分支最新Commit = $latest_commit" >&2
|
||||
|
||||
if [ -z "$latest_commit" ]; then
|
||||
echo " 调试:无有效提交" >&2
|
||||
echo ""
|
||||
return
|
||||
fi
|
||||
|
||||
# 匹配 模块名-xxx 格式标签,绑定对应commit
|
||||
local tag_val
|
||||
tag_val=$(git ls-remote --tags origin "${module_dir}-*" 2>/dev/null \
|
||||
# 匹配模块名-开头标签,取出标签名
|
||||
local target_tag
|
||||
target_tag=$(git ls-remote --tags origin "${module_dir}-*" 2>/dev/null \
|
||||
| grep -v '\^{}' \
|
||||
| awk -v cm="$latest_commit" '$1==cm{print $2}' \
|
||||
| sed 's/refs\/tags\///')
|
||||
|
||||
# 纯净返回标签字符串
|
||||
echo "$tag_val"
|
||||
# 输出格式:标签名|commit哈希
|
||||
echo "${target_tag}|${latest_commit}"
|
||||
}
|
||||
|
||||
# ====================== 进入工作目录 ======================
|
||||
@@ -42,7 +39,7 @@ if ! cd "$TARGET_DIR"; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ====================== 同步远程代码与所有标签 ======================
|
||||
# ====================== 同步远程代码与标签 ======================
|
||||
echo "=============================================="
|
||||
echo "同步远程代码及全部版本标签"
|
||||
echo "=============================================="
|
||||
@@ -51,7 +48,7 @@ git fetch origin --tags
|
||||
echo "同步完成"
|
||||
echo ""
|
||||
|
||||
# ====================== 强制锁定本地分支 ======================
|
||||
# ====================== 锁定目标分支 ======================
|
||||
CUR_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null)
|
||||
TARGET_BRANCH="projects_keeper_tag"
|
||||
if [ "$CUR_BRANCH" != "$TARGET_BRANCH" ]; then
|
||||
@@ -59,7 +56,7 @@ if [ "$CUR_BRANCH" != "$TARGET_BRANCH" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ====================== 目录校验数组(保留原样) ======================
|
||||
# ====================== 目录结构校验 ======================
|
||||
MERGE_OBJECTS_LIST=(
|
||||
.git
|
||||
.gitignore
|
||||
@@ -138,47 +135,53 @@ check_diff() {
|
||||
check_diff
|
||||
|
||||
# ====================== 开始合并模块 ======================
|
||||
echo -e "#@@@ 开始合并标签版本模块源码 @@@#"
|
||||
echo -e "#@@@ 开始按标签对应提交点合并模块 @@@#"
|
||||
|
||||
## 合并应用型模块
|
||||
MERGE_APP_PROJECT_LIST=(DemoAPP)
|
||||
echo -e "#@@@ 应用型模块开始合并 @@#"
|
||||
echo -e "#@@@ 应用型模块合并开始 @@#"
|
||||
for item in "${MERGE_APP_PROJECT_LIST[@]}"; do
|
||||
item_lower=$(echo "$item" | tr 'A-Z' 'a-z')
|
||||
MOD_TAG=$(get_module_latest_tag "$item_lower")
|
||||
tag_info=$(get_module_tag_commit "$item_lower")
|
||||
|
||||
# 无标签直接跳过,不执行任何操作
|
||||
if [ -z "$MOD_TAG" ]; then
|
||||
echo "跳过 $item_lower 未匹配对应版本标签"
|
||||
# 分割 标签名 和 commit哈希
|
||||
MOD_TAG=${tag_info%%|*}
|
||||
MOD_COMMIT=${tag_info##*|}
|
||||
|
||||
if [ -z "$MOD_TAG" ] || [ -z "$MOD_COMMIT" ]; then
|
||||
echo "跳过 $item_lower 未匹配有效标签与提交点"
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "正在合并 $item_lower 标签版本:$MOD_TAG"
|
||||
# 从远程标签拉取文件夹覆盖到本地
|
||||
git checkout origin/tags/"$MOD_TAG" -- "$item_lower"
|
||||
# 仅添加当前模块文件,不全局add
|
||||
git add "$item_lower"
|
||||
git commit -m "合并模块 $item ,来源版本标签:$MOD_TAG"
|
||||
echo "模块:$item_lower 标签:$MOD_TAG 对应提交点:$MOD_COMMIT"
|
||||
# 核心:从远程模块分支 指定commit拉取对应文件夹
|
||||
git checkout "origin/${item_lower}" "${MOD_COMMIT}:${item_lower}"
|
||||
git add "${item_lower}"
|
||||
git commit -m "合并模块 $item ,来源标签:$MOD_TAG 提交点:$MOD_COMMIT"
|
||||
done
|
||||
|
||||
## 合并类库模块
|
||||
MERGE_LIB_PROJECT_LIST=(WinBoLL APPBase AES)
|
||||
echo -e "#@@@ 类库模块开始合并 @@#"
|
||||
echo -e "#@@@ 类库模块合并开始 @@#"
|
||||
for item in "${MERGE_LIB_PROJECT_LIST[@]}"; do
|
||||
item_lower=$(echo "$item" | tr 'A-Z' 'a-z')
|
||||
MOD_TAG=$(get_module_latest_tag "$item_lower")
|
||||
tag_info=$(get_module_tag_commit "$item_lower")
|
||||
|
||||
if [ -z "$MOD_TAG" ]; then
|
||||
echo "跳过 $item_lower 未匹配对应版本标签"
|
||||
MOD_TAG=${tag_info%%|*}
|
||||
MOD_COMMIT=${tag_info##*|}
|
||||
|
||||
if [ -z "$MOD_TAG" ] || [ -z "$MOD_COMMIT" ]; then
|
||||
echo "跳过 $item_lower 未匹配有效标签与提交点"
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "正在合并 $item_lower 标签版本:$MOD_TAG"
|
||||
git checkout origin/tags/"$MOD_TAG" -- "$item_lower" "lib$item_lower"
|
||||
git add "$item_lower" "lib$item_lower"
|
||||
git commit -m "合并模块 $item ,来源版本标签:$MOD_TAG"
|
||||
echo "模块:$item_lower 标签:$MOD_TAG 对应提交点:$MOD_COMMIT"
|
||||
# 拉取主目录 + lib目录 指定commit文件
|
||||
git checkout "origin/${item_lower}" "${MOD_COMMIT}:${item_lower}" "${MOD_COMMIT}:lib${item_lower}"
|
||||
git add "${item_lower}" "lib${item_lower}"
|
||||
git commit -m "合并模块 $item ,来源标签:$MOD_TAG 提交点:$MOD_COMMIT"
|
||||
done
|
||||
|
||||
echo "所有模块合并执行完毕"
|
||||
echo "所有模块合并完成"
|
||||
echo "准备推送远程分支"
|
||||
git push
|
||||
|
||||
Reference in New Issue
Block a user