Skip to content

Commit ff6930b

Browse files
committed
feat: git钩子会默认带上Lab工作区所有内容 & 空提交保护
1 parent 50d9f4e commit ff6930b

1 file changed

Lines changed: 33 additions & 16 deletions

File tree

.githooks/submodule/post-push

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ set -e
77

88
# 子模块根目录 & 父仓库根目录
99
SUB_DIR=$(git rev-parse --show-toplevel)
10+
LATEST_MSG=$(git -C "$SUB_DIR" log -1 --pretty=%B)
1011
# 动态定位父仓库,适用于任意深度的子模块
1112
PARENT_DIR=$(git -C "$SUB_DIR" rev-parse --show-superproject-working-tree 2>/dev/null)
1213
if [ -z "$PARENT_DIR" ]; then
@@ -25,39 +26,55 @@ cd "$PARENT_DIR" || exit 1
2526
# 先拉取远端最新,避免 non-fast-forward 推送失败
2627
git pull --no-rebase --no-edit
2728

29+
# 默认把 Lab 父仓库当前工作区的所有改动一起带上,
30+
# 避免子模块同步时漏掉同批次的父仓库修改。
31+
git add -A
32+
2833
# 父仓库当前记录的子模块指针(旧 SHA)
2934
OLD_SHA=$(git ls-tree HEAD "$SUB_REL" | awk '{print $3}')
3035
# 子模块当前 HEAD(新 SHA)
3136
NEW_SHA=$(git -C "$SUB_DIR" rev-parse HEAD)
3237

3338
if [ "$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
3658
fi
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-
5160
COUNT=0
5261
for 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)"
5971
done
6072

73+
if [ "$COUNT" -eq 0 ]; then
74+
echo "[post-push] 父仓库无需更新(没有新的已暂存改动)"
75+
exit 0
76+
fi
77+
6178
echo "[post-push] 共创建 $COUNT 条父仓库提交,开始推送..."
6279

6380
# 推送,失败则 pull merge 后重试(应对竞态场景),最多 3 次

0 commit comments

Comments
 (0)