exbrain/vault-template/scripts/git-pull-sync.sh

40 lines
1.3 KiB
Bash
Executable file

#!/bin/bash
# git-pull-sync.sh — GitHub から最新を取得して iCloud に反映
# launchd で毎時実行。Cloud Taskがpushした変更をローカルに取り込む。
set +e
VAULT_DIR="$HOME/vault"
LOG_FILE="$VAULT_DIR/.sync.log"
LOCKFILE="$VAULT_DIR/.git-sync.lock"
cd "$VAULT_DIR" || exit 0
# ロックファイルで同時実行を防止
if [ -f "$LOCKFILE" ] && kill -0 "$(cat "$LOCKFILE" 2>/dev/null)" 2>/dev/null; then
echo "[$(date '+%F %T')] git-pull: locked, skipping" >> "$LOG_FILE"; exit 0
fi
echo $$ > "$LOCKFILE"
trap 'rm -f "$LOCKFILE"' EXIT
DIRTY=$(git status --porcelain 2>/dev/null | wc -l | tr -d ' ')
if [ "$DIRTY" -gt "0" ]; then
git stash 2>/dev/null
if ! git pull --rebase origin main 2>/dev/null; then
git rebase --abort 2>/dev/null
echo "[$(date '+%F %T')] git-pull: rebase failed, aborted" >> "$LOG_FILE"
fi
if ! git stash pop 2>/dev/null; then
echo "[$(date '+%F %T')] git-pull: stash pop FAILED — manual resolution needed" >> "$LOG_FILE"
git checkout -- . 2>/dev/null
git stash drop 2>/dev/null
fi
echo "[$(date '+%F %T')] git-pull: pulled with stash (dirty=$DIRTY)" >> "$LOG_FILE"
else
RESULT=$(git pull --rebase origin main 2>&1)
if ! echo "$RESULT" | grep -q "Already up to date"; then
echo "[$(date '+%F %T')] git-pull: $RESULT" >> "$LOG_FILE"
fi
fi
exit 0