77 lines
2.6 KiB
Shell
Executable file
77 lines
2.6 KiB
Shell
Executable file
#!/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"
|