77
88# 子模块根目录 & 父仓库根目录
99SUB_DIR=$( git rev-parse --show-toplevel)
10+ LATEST_MSG=$( git -C " $SUB_DIR " log -1 --pretty=%B)
1011# 动态定位父仓库,适用于任意深度的子模块
1112PARENT_DIR=$( git -C " $SUB_DIR " rev-parse --show-superproject-working-tree 2> /dev/null)
1213if [ -z " $PARENT_DIR " ]; then
@@ -25,39 +26,55 @@ cd "$PARENT_DIR" || exit 1
2526# 先拉取远端最新,避免 non-fast-forward 推送失败
2627git pull --no-rebase --no-edit
2728
29+ # 默认把 Lab 父仓库当前工作区的所有改动一起带上,
30+ # 避免子模块同步时漏掉同批次的父仓库修改。
31+ git add -A
32+
2833# 父仓库当前记录的子模块指针(旧 SHA)
2934OLD_SHA=$( git ls-tree HEAD " $SUB_REL " | awk ' {print $3}' )
3035# 子模块当前 HEAD(新 SHA)
3136NEW_SHA=$( git -C " $SUB_DIR " rev-parse HEAD)
3237
3338if [ " $OLD_SHA " = " $NEW_SHA " ]; then
34- echo " [post-push] 父仓库无需更新(指针未变化)"
35- exit 0
39+ if git diff --cached --quiet; then
40+ echo " [post-push] 父仓库无需更新(指针未变化且工作区无变更)"
41+ exit 0
42+ fi
43+ echo " [post-push] 子模块指针未变化,改为提交 Lab 工作区改动..."
44+ COMMITS=" $NEW_SHA "
45+ else
46+ # 某些大体量/高频同步子模块只需要在父仓库记录最终指针,
47+ # 避免为同一次 push 中的每个子提交都生成一条父仓库提交。
48+ case " $SUB_REL " in
49+ " AI/3-Application/Openclaw-source" )
50+ echo " [post-push] $SUB_REL 使用最终指针模式(只提交最新 SHA)..."
51+ COMMITS=" $NEW_SHA "
52+ ;;
53+ * )
54+ # 按时间顺序列出 OLD_SHA..NEW_SHA 之间的每一个提交(从旧到新)
55+ COMMITS=$( git -C " $SUB_DIR " log --reverse --pretty=" %H" " ${OLD_SHA} ..${NEW_SHA} " )
56+ ;;
57+ esac
3658fi
3759
38- # 某些大体量/高频同步子模块只需要在父仓库记录最终指针,
39- # 避免为同一次 push 中的每个子提交都生成一条父仓库提交。
40- case " $SUB_REL " in
41- " AI/3-Application/Openclaw-source" )
42- echo " [post-push] $SUB_REL 使用最终指针模式(只提交最新 SHA)..."
43- COMMITS=" $NEW_SHA "
44- ;;
45- * )
46- # 按时间顺序列出 OLD_SHA..NEW_SHA 之间的每一个提交(从旧到新)
47- COMMITS=$( git -C " $SUB_DIR " log --reverse --pretty=" %H" " ${OLD_SHA} ..${NEW_SHA} " )
48- ;;
49- esac
50-
5160COUNT=0
5261for SHA in $COMMITS ; do
53- MSG=$( git -C " $SUB_DIR " log -1 --pretty=%B " $SHA " )
62+ MSG=$( git -C " $SUB_DIR " log -1 --pretty=%B " $SHA " 2> /dev/null || printf ' %s ' " $LATEST_MSG " )
5463 # 将父仓库 index 中的子模块指针拨到该 SHA,无需实际 checkout 子模块
5564 git update-index --cacheinfo " 160000,${SHA} ,${SUB_REL} "
65+ if git diff --cached --quiet; then
66+ continue
67+ fi
5668 git commit -m " $MSG "
5769 COUNT=$(( COUNT + 1 ))
5870 echo " [post-push] [$COUNT ] 已提交父仓库:${SHA} - $( echo " $MSG " | head -1) "
5971done
6072
73+ if [ " $COUNT " -eq 0 ]; then
74+ echo " [post-push] 父仓库无需更新(没有新的已暂存改动)"
75+ exit 0
76+ fi
77+
6178echo " [post-push] 共创建 $COUNT 条父仓库提交,开始推送..."
6279
6380# 推送,失败则 pull merge 后重试(应对竞态场景),最多 3 次
0 commit comments