@@ -1,50 +1,44 @@
#!/system/bin/sh
## 流程: 获取远程最新Tag → 获取Tag对应Commit → 按Commit合并远程模块目录到本地
## 逻辑:按时间取最新标签 → 拉取该标签目录合并
# ====================== 1. 获取模块远程最新版本TAG ======================
get_module_latest _tag( ) {
local module_name = " $1 "
git fetch origin --tags 2>/dev/null
git ls-remote --tags origin " ${ module_name } -* " 2>/dev/null \
# 按创建时间取模块最新标签(最新打的标签排最后)
get_latest_module _tag( ) {
local mod= $1
git for -each-ref --sort= -creatordate --format= '%(refname)' refs/tags/${ mod } -* \
| grep -v '\^{}' \
| sort -V \
| tail -1 \
| awk '{print $2}' \
| head -1 \
| sed 's/refs\/tags\///'
}
# ====================== 2. 通过TAG获取对应提交Commit哈希 ======================
get_commit_by _tag( ) {
local tag_name = " $1 "
git rev-list -1 " $tag_name " 2>/dev/null
# 通过标签获取commit
get_commit_from _tag( ) {
local tag= $1
git rev-parse --short " ${ tag } ^{commit} "
}
# ====================== 进入工作目录 ======================
# 工作目录
TARGET_DIR = "/sdcard/AppProjects/Projects_Keeper_Tag"
echo " 切换工作目录: $ TARGET_DIR"
if ! cd " $ TARGET_DIR" ; then
echo "目录切换失败!"
exit 1
fi
echo " 进入目录: ${ TARGET_DIR} "
cd " ${ TARGET_DIR } " || exit 1
# ====================== 同步远程全部标签 ======================
echo "============================================== "
echo "同步远程所有 分支与版本标签"
echo "============================================== "
# 同步远程
echo "========================================"
echo "同步远程分支与全部 版本标签"
echo "========================================"
git fetch origin --prune
git fetch origin --tags
echo "同步完成"
echo ""
# ====================== 锁定本地目标分支 ======================
CUR _BRANCH= $( git symbolic-ref --short HEAD 2>/dev/null )
# 校验目标分支
NOW _BRANCH= $( git symbolic-ref --short HEAD)
TARGET_BRANCH = "projects_keeper_tag"
if [ " $CUR _BRANCH" != " $ TARGET_BRANCH" ] ; then
echo " 错误:当前不在 $ TARGET_BRANCH 分支,请先切换! "
if [ " ${ NOW _BRANCH} " != " ${ TARGET_BRANCH } " ] ; then
echo " 错误:请先切换到 ${ TARGET_BRANCH } 分支 "
exit 1
fi
# ====================== 目录结构校验 ======================
# 目录结构校验
MERGE_OBJECTS_LIST = (
.git
.gitignore
@@ -83,102 +77,69 @@ winboll.properties-demo
REAL_ITEMS = ( )
while IFS = read -r line; do
if [ [ " $line " != "." && " $line " != ".." ] ] ; then
REAL_ITEMS += ( " $line " )
fi
[ [ $line != "." && $line != ".." ] ] && REAL_ITEMS += ( " $line " )
done < <( ls -a)
check_diff( ) {
local missing = ( )
local extra = ( )
for item in " ${ MERGE_OBJECTS_LIST [@] } " ; do
local found = 0
for r in " ${ REAL_ITEMS [@] } " ; do
if [ [ " $item " = = " $r " ] ] ; then
found = 1
break
fi
done
if ( ( found = = 0 ) ) ; then
missing += ( " $item " )
fi
check_diff( ) {
local miss= ( ) extra = ( )
for i in " ${ MERGE_OBJECTS_LIST [@] } " ; do
[ [ ! " ${ REAL_ITEMS [@] } " = ~ " ${ i } " ] ] && miss += ( " $i " )
done
for r in " ${ REAL_ITEMS [@] } " ; do
local found = 0
for item in " ${ MERGE_OBJECTS_LIST [@] } " ; do
if [ [ " $item " = = " $r " ] ] ; then
found = 1
break
fi
done
if ( ( found = = 0 ) ) ; then
extra += ( " $r " )
fi
for i in " ${ REAL_ITEMS [@] } " ; do
[ [ ! " ${ MERGE_OBJECTS_LIST [@] } " = ~ " ${ i } " ] ] && extra += ( " $i " )
done
if [ [ ${# missing [@] } -gt 0 || ${# extra [@] } -gt 0 ] ] ; then
echo "目录结构不匹配 ,终止执 行"
if [ [ ${# miss [@] } -gt 0 || ${# extra [@] } -gt 0 ] ] ; then
echo "本地 目录结构不一致 ,终止运 行"
exit 1
fi
}
check_diff
# ====================== 开始批量合并模块 ======================
echo -e "#@@@ 开始按【最新Tag+对应Commit】合并模块 @@@#"
echo -e "#@@@ 按时间获取最新标签合并模块源码 @@@#"
## 合并 应用型模块
# 应用型模块
MERGE_APP_PROJECT_LIST = ( DemoAPP)
echo -e "---------- 应用型模块合并 ----------"
for item in " ${ MERGE_APP_PROJECT_LIST [@] } " ; do
item_lower = $( echo " $item " | tr 'A-Z' 'a-z' )
LATEST_TAG = $( get_module_latest_tag " $item_lower " )
if [ -z " $LATEST_TAG " ] ; then
echo " 跳过 $item_lower :未查询到任何版本 标签"
echo -e "---------- 应用型模块 ----------"
for name in " ${ MERGE_APP_PROJECT_LIST [@] } " ; do
low_name = $( echo " $name " | tr 'A-Z' 'a-z' )
tag = $( get_latest_module_tag " ${ low_name } " )
if [ [ -z " ${ tag } " ] ] ; then
echo " 跳过 ${ low_name } :无远程 标签"
continue
fi
TARGET_COMMIT = $( get_commit_by _tag " $LATEST_TAG " )
if [ -z " $TARGET_COMMIT " ] ; then
echo " 跳过 $item_lower :标签 $LATEST_TAG 未查询到对应 提交点"
commit = $( get_commit_from _tag " ${ tag } " )
if [ [ -z " ${ commit } " ] ] ; then
echo " 跳过 ${ low_name } :标签无有效 提交点 "
continue
fi
echo " 模块: $item_lower "
echo " 最新标签: $LATEST_TAG "
echo " 对应提交点: $TARGET_COMMIT "
echo "---------------------------------------- "
# 正确写法: 用commit检出指定目录
git checkout ${ TARGET_COMMIT } -- ${ item_lower }
git add ${ item_lower }
git commit -m " 合并模块 ${ item } 来源最新标签: ${ LATEST_TAG } 提交点: ${ TARGET_COMMIT } "
echo " 模块: ${ low_name } 最新时间标签: ${ tag } 提交ID: ${ commit } "
# 强制拉取覆盖
git checkout -f " ${ tag } " -- " ${ low_name } "
git add " ${ low_name } "
git commit -m " 合并模块 ${ name } 同步最新时间标签 ${ tag } "
done
## 合并 类库模块
# 类库模块
MERGE_LIB_PROJECT_LIST = ( WinBoLL APPBase AES)
echo -e "---------- 类库模块合并 ----------"
for item in " ${ MERGE_LIB_PROJECT_LIST [@] } " ; do
item_lower = $( echo " $item " | tr 'A-Z' 'a-z' )
LATEST_TAG = $( get_module_latest_tag " $item_lower " )
if [ -z " $LATEST_TAG " ] ; then
echo " 跳过 $item_lower :未查询到任何版本 标签"
echo -e "---------- 类库模块 ----------"
for name in " ${ MERGE_LIB_PROJECT_LIST [@] } " ; do
low_name = $( echo " $name " | tr 'A-Z' 'a-z' )
tag = $( get_latest_module_tag " ${ low_name } " )
if [ [ -z " ${ tag } " ] ] ; then
echo " 跳过 ${ low_name } :无远程 标签"
continue
fi
TARGET_COMMIT = $( get_commit_by _tag " $LATEST_TAG " )
if [ -z " $TARGET_COMMIT " ] ; then
echo " 跳过 $item_lower :标签 $LATEST_TAG 未查询到对应 提交点"
commit = $( get_commit_from _tag " ${ tag } " )
if [ [ -z " ${ commit } " ] ] ; then
echo " 跳过 ${ low_name } :标签无有效 提交点 "
continue
fi
echo " 模块: $item_lower "
echo " 最新标签: $LATEST_TAG "
echo " 对应提交点: $TARGET_COMMIT "
echo "----------------------------------------"
# 同时检出主目录 + lib目录
git checkout ${ TARGET_COMMIT } -- ${ item_lower } lib${ item_lower }
git add ${ item_lower } lib${ item_lower }
git commit -m " 合并模块 ${ item } 来源最新标签: ${ LATEST_TAG } 提交点: ${ TARGET_COMMIT } "
echo " 模块: ${ low_name } 最新时间标签: ${ tag } 提交ID: ${ commit } "
git checkout -f " ${ tag } " -- " ${ low_name } " " lib ${ low_name } "
git add " ${ low_name } " " lib ${ low_name } "
git commit -m " 合并模块 ${ name } 同步最新时间标签 ${ tag } "
done
echo "所有 模块合并流程 执行完毕"
echo "准备推送至远程分支 "
echo "全部 模块合并执行完毕"
echo "执行推送: git push "
git push