@@ -1,81 +1,44 @@
#!/system/bin/sh
## 合并其他项目分支的模块源码到projects_keeper_tag分支。
## 逻辑:按时间取最新标签 → 拉取该标签目录合并
# ====================== 函数定义:获取模块最新提交对应的远程标签 ======================
# 参数1: 模块名( 小写如appbase、aes)
# 自动以 origin/模块名 作为远程分支
# 返回:有标签输出标签名,无标签输出空
get_module_latest_tag( ) {
local module_dir = " $1 "
local remote_branch = " origin/ ${ module_dir } "
# 先同步远程分支元数据
git fetch origin " $module_dir " 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 "
# 无commit直接返回空
if [ -z " $latest_commit " ] ; then
echo " 调试: 未获取到有效Commit, 跳过"
return
fi
# 精准匹配:模块名- 开头标签 + 严格比对commit哈希
git ls-remote --tags origin " ${ module_dir } -* " 2>/dev/null \
# 按创建时间取模块最新标签(最新打的标签排最后)
get_latest_module_tag( ) {
local mod = $1
git for -each-ref --sort= -creatordate --format= '%(refname)' refs/tags/${ mod } -* \
| grep -v '\^{}' \
| awk -v target_commit = " $latest_commit " '$1 == target_commit {print $2}' \
| sed " s/refs\/tags\///"
| head -1 \
| sed ' s/refs\/tags\///'
}
# ====================== 0. 进入目标目录 ======================
# 通过标签获取commit
get_commit_from_tag( ) {
local tag = $1
git rev-parse --short " ${ tag } ^{commit} "
}
# 工作目录
TARGET_DIR = "/sdcard/AppProjects/Projects_Keeper_Tag"
echo " 进入目录: ${ TARGET_DIR } "
cd " ${ TARGET_DIR } " || exit 1
echo " 切换工作目录到: $TARGET_DIR "
if ! cd " $TARGET_DIR " ; then
echo "============================================== "
echo "错误:无法进入目标目录 $TARGET_DIR "
echo "=============================================="
exit 1
fi
# ====================== 1. 拉取远程最新源码(失败直接退出) ======================
echo "=============================================="
echo "正在拉取远程最新源码..."
echo "=============================================="
if ! git pull; then
echo "=============================================="
echo "错误:拉取远程源码失败!"
echo "请检查网络、仓库冲突或手动处理 git 状态后再执行脚本。"
echo "=============================================="
exit 1
fi
echo "✅ 源码已拉取为最新状态"
# 同步远程
echo "========================================"
echo "同步远程分支与全部版本标签 "
echo "======================================== "
git fetch origin --prune
git fetch origin --tags
echo "同步完成"
echo ""
# ====================== 2. 目录路径检查 ======================
CUR_DIR = $( pwd )
if [ " $CUR_DIR " != " $TARGET_DIR " ] ; then
echo "错误:当前目录不是项目根目录!"
echo " 请先进入目录: $TARGET_DIR "
exit 1
fi
# ====================== 3. Git 分支检查 ======================
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 分支! "
echo " 当前分支: $CUR_BRANCH "
echo " 请先执行: git checkout $TARGET_BRANCH "
if [ " ${ NOW_BRANCH } " != " ${ TARGET_BRANCH } " ] ; then
echo " 错误:请先切换到 ${ TARGET_BRANCH } 分支 "
exit 1
fi
# ====================== 4. 预设标准模块列表 ======================
# 目录结构校验
MERGE_OBJECTS_LIST = (
.git
.gitignore
@@ -112,121 +75,71 @@ winboll
winboll.properties-demo
)
# ====================== 5. 获取当前目录真实文件列表 ======================
REAL_ITEMS = ( )
while IFS = read -r line; do
if [ [ " $line " != "." && " $line " != ".." ] ] ; then
REAL_ITEMS += ( " $line " )
fi
[ [ $line != "." && $line != ".." ] ] && REAL_ITEMS += ( " $line " )
done < <( ls -a)
# ====================== 6. 差异比对函数 ======================
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 "=============================================="
echo "【错误】合并环境与脚本预设列表不匹配!"
echo "请手动核对并修改合并脚本。"
echo "=============================================="
if [ [ ${# missing [@] } -gt 0 ] ] ; then
echo -e "\n👉 本地缺失项目:"
for m in " ${ missing [@] } " ; do echo " $m " ; done
fi
if [ [ ${# extra [@] } -gt 0 ] ] ; then
echo -e "\n👉 本地多余项目:"
for e in " ${ extra [@] } " ; do echo " $e " ; done
fi
echo -e "\n=============================================="
if [ [ ${# miss [@] } -gt 0 || ${# extra [@] } -gt 0 ] ] ; then
echo "本地目录结构不一致,终止运行"
exit 1
fi
}
# 执行差异校验
check_diff
# ====================== 全部校验通过,继续执行合并 ======================
echo -e "#@@@ 开始合并模块源码 @@@#
## 目标合并对象列表:"
echo -e "#@@@ 按时间获取最新标签合并模块源码 @@@#"
for item in " ${ MERGE_OBJECTS_LIST [@] } " ; do
echo " $item "
done
echo -e "## 对象列表结束
"
## 合并 APP 项目
MERGE_APP_PROJECT_LIST = (
DemoAPP
)
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 " )
# 无标签直接跳过所有操作: 不checkout、不add、不commit
if [ -z " $MOD_TAG " ] ; then
echo " 跳过 $item_lower :最新提交未打标签 "
# 应用型模块
MERGE_APP_PROJECT_LIST = ( DemoAPP)
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
echo " 合并 $item_lower ( 远程分支: origin/ $item_lower ,标签: $MOD_TAG ) "
git checkout origin/$item_lower $item_lower
git add .
git commit -m " 合并 $item 项目, $MOD_TAG "
done
## 合并 LIB 项目
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' )
MOD_TAG = $( get_module_latest_tag " $item_lower " )
# 无标签直接跳过所有操作
if [ -z " $MOD_TAG " ] ; then
echo " 跳过 $item_lower :最新提交未打标签 "
commit = $( get_commit_from_tag " ${ tag } " )
if [ [ -z " ${ commit } " ] ] ; then
echo " 跳过 ${ low_name } :标签无有效提交点 "
continue
fi
echo " 合并 $item_lower ( 远程分支: origin/ $item_lower ,标签: $MOD_TAG ) "
git checkout origin/$item_lower $item_lower lib$item_lower
git add .
git commit -m " 合并 $item 项目, $MOD_TAG "
echo " 模块: ${ low_name } 最新时间标签: ${ tag } 提交ID: ${ commit } "
# 强制拉取覆盖
git checkout -f " ${ tag } " -- " ${ low_name } "
git add " ${ low_name } "
git commit -m " 合并模块 ${ name } 同步最新时间标签 ${ tag } "
done
echo '正在推送 Projects_Keeper 项目'
# 类库模块
MERGE_LIB_PROJECT_LIST = ( WinBoLL APPBase AES)
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
commit = $( get_commit_from_tag " ${ tag } " )
if [ [ -z " ${ commit } " ] ] ; then
echo " 跳过 ${ low_name } :标签无有效提交点 "
continue
fi
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 "执行推送: git push"
git push