40 lines
1.3 KiB
Bash
Executable file
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
|