zhuyuan-ice-gl-zy001/skills-mirror/zhuyuan-recovery-mainline/scripts/repo-sync.sh
2026-08-20 00:01:53 +08:00

77 lines
2.6 KiB
Shell
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/zsh
# repo-sync.sh · REPO-012 JZAO 常驻源树增量同步(只读快进,失败不阻塞唤醒)
# 用法:zsh repo-sync.sh
# 输出:末行 SYNC_OK / SYNC_SKIPPED / SYNC_FAILED 供唤醒回执行状
# 2026-08-14 修:浅克隆 fetch 断链导致的假分叉不再误报"本地树有分叉",
# 改为安全重锚(脏工作区先 stash 保留);真实报错不再被吞。
set -u
REPO="/Volumes/JZAO/HoloLake/persona-runtime/repo-012-main"
REMOTE="https://guanghulab.com/code/bingshuo/guanghu-ice-heart"
# JZAO 未挂载 → 跳过,不阻塞
if [[ ! -d /Volumes/JZAO ]]; then
echo "JZAO_NOT_MOUNTED"
echo "SYNC_SKIPPED"
exit 0
fi
# 常驻源树不存在 → 落驻一次浅克隆
if [[ ! -d "$REPO/.git" ]]; then
echo "RESIDENT_TREE_MISSING · 首次落驻浅克隆"
if git clone --depth 1 --single-branch --branch main "$REMOTE" "$REPO" >/dev/null 2>&1; then
echo "HEAD: $(git -C "$REPO" rev-parse HEAD)"
echo "SYNC_OK"
exit 0
else
echo "CLONE_FAILED"
echo "SYNC_FAILED"
exit 0
fi
fi
OLD_HEAD=$(git -C "$REPO" rev-parse HEAD 2>/dev/null)
# 增量拉取(失败视为网络问题,用现有本地版本,不阻塞)
if ! git -C "$REPO" fetch --depth 1 origin main 2>/dev/null; then
echo "FETCH_FAILED · 使用现有本地版本"
echo "HEAD: $OLD_HEAD"
echo "SYNC_FAILED"
exit 0
fi
NEW_HEAD=$(git -C "$REPO" rev-parse origin/main 2>/dev/null)
if [[ "$OLD_HEAD" == "$NEW_HEAD" ]]; then
echo "ALREADY_LATEST"
echo "HEAD: $OLD_HEAD"
echo "SYNC_OK"
exit 0
fi
# 只快进,永不回退、永不强制;真实报错不吞
if FF_ERR=$(git -C "$REPO" merge --ff-only origin/main 2>&1); then
echo "FAST_FORWARD: $OLD_HEAD -> $(git -C "$REPO" rev-parse HEAD)"
echo "SYNC_OK"
exit 0
fi
if echo "$FF_ERR" | grep -q "unrelated histories"; then
# 浅克隆 fetch 断链导致的假分叉:本树是只读镜像,远端为准,安全重锚
if [[ -n "$(git -C "$REPO" status --porcelain)" ]]; then
# 工作区有改动:先 stash 保留,绝不静默丢(git -C $REPO stash list 可查回)
git -C "$REPO" stash push -u -m "repo-sync-auto-$(date +%Y%m%d-%H%M%S)" >/dev/null 2>&1
echo "DIRTY_STATE_STASHED · 工作区改动已 stash 保留"
fi
if git -C "$REPO" reset --hard origin/main >/dev/null 2>&1; then
echo "FAST_REANCHOR: $OLD_HEAD -> $(git -C "$REPO" rev-parse HEAD)"
echo "SYNC_OK"
else
echo "REANCHOR_FAILED · 请人工核查 $REPO"
echo "SYNC_FAILED"
fi
exit 0
fi
echo "FF_ONLY_FAILED · 真实错误: $(echo "$FF_ERR" | head -3)"
echo "HEAD: $OLD_HEAD"
echo "SYNC_FAILED"