diff --git a/GIT-SYNC.md b/GIT-SYNC.md new file mode 100644 index 0000000..d133d7c --- /dev/null +++ b/GIT-SYNC.md @@ -0,0 +1,232 @@ +# Git Auto-Sync Setup for Second Brain + +Automatically sync vault changes between server, desktop, and phone using Git. + +## How It Works + +``` +Desktop/Phone Changes → Git Repo ← Server Auto-Commits + ↓ + All devices sync +``` + +## Server Setup + +### 1. Install Auto-Sync Service + +```bash +sudo cp /workspace/second-brain/git-auto-sync.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable git-auto-sync.service +sudo systemctl start git-auto-sync.service + +# Verify +sudo systemctl status git-auto-sync.service +``` + +### 2. Watch Auto-Commits + +```bash +# View logs +sudo journalctl -fu git-sync + +# Example output: +# [2026-04-26 07:45:30] Changes detected: +# M 03-learnings/architecture.md +# A 00-inbox/new-idea.md +# ✓ Committed +# ✓ Pushed to remote +``` + +## Desktop Setup + +### 1. Clone the Vault + +```bash +# First time +git clone ssh://user@server:/workspace/second-brain ~/Obsidian/second-brain + +# Or if using Local Sync, configure it to pull from this git repo +``` + +### 2. Pull Latest Changes + +```bash +cd ~/Obsidian/second-brain +git pull +``` + +### 3. Auto-Pull (Optional) + +**macOS/Linux:** +```bash +# Add to crontab (every 5 minutes) +crontab -e +*/5 * * * * cd ~/Obsidian/second-brain && git pull -q 2>/dev/null +``` + +**Or use a Git hook:** +```bash +cat > .git/hooks/post-merge << 'EOF' +#!/bin/bash +# Auto-sync after merge +echo "✓ Vault synced" +EOF +chmod +x .git/hooks/post-merge +``` + +## Phone Setup + +### With Obsidian + Local Sync Plugin + +1. **On Server:** + - Make sure git repo is accessible (or use Gitea) + +2. **On Phone:** + - Install "Local Sync" plugin in Obsidian + - Configure it to sync with: `ssh://user@server:/workspace/second-brain` + - Or configure with Gitea URL + +3. **On Desktop:** + - Same setup, pull regularly + +--- + +## Sync Strategies + +### Strategy 1: Git-Only (Recommended) + +- Server auto-commits all changes +- Desktop: `git pull` manually or via cron +- Phone: Local Sync pulls from server git + +```bash +# Desktop cron (every 5 min) +*/5 * * * * cd ~/Obsidian/second-brain && git pull -q +``` + +### Strategy 2: Obsidian + Local Sync + +- Desktop + Phone: Use Obsidian's Local Sync plugin +- Server: Git auto-sync mirrors changes + +**Advantage:** Real-time sync on devices, server keeps git history + +### Strategy 3: Git + SSH Pull + +- Desktop/Phone: SSH git clone +- Pull before opening Obsidian +- Push changes after editing + +```bash +#!/bin/bash +# pre-open-obsidian.sh +cd ~/Obsidian/second-brain +git pull +open ~/Obsidian/second-brain # macOS +``` + +--- + +## Remote Repository (Gitea / GitHub) + +### Configure Remote Push + +**If using Gitea on your server:** + +```bash +# On server +cd /workspace/second-brain +git remote add gitea ssh://git@gitea-server/your-repo.git + +# Verify +git remote -v + +# Push existing commits +git push -u gitea master +``` + +**Then on desktop/phone:** + +```bash +git clone ssh://git@gitea-server/your-repo.git +``` + +--- + +## Monitoring Syncs + +### View Recent Commits + +```bash +cd /workspace/second-brain +git log --oneline -10 +``` + +### Check Sync Status + +```bash +# See what's staged but not committed +git status + +# See changes in last hour +git log --since="1 hour ago" --oneline +``` + +### Manual Sync Test + +```bash +# On desktop: make a change +echo "test" >> 00-inbox/test.md +git add . +git commit -m "Test sync" +git push + +# On server: should auto-pull (if configured) +cd /workspace/second-brain +git log --oneline -1 +``` + +--- + +## Conflict Resolution + +If both server and desktop edit the same file: + +```bash +# Server (auto-sync) will get it first +# Desktop pulls and sees conflict marker: + +<<<<<<< HEAD +desktop version +======= +server version +>>>>>>> origin/master + +# Manually resolve, then: +git add . +git commit -m "Resolved conflict" +git push +``` + +--- + +## Disable Auto-Sync (if needed) + +```bash +sudo systemctl stop git-auto-sync.service +sudo systemctl disable git-auto-sync.service +``` + +--- + +## Performance Notes + +- **Poll interval:** 30 seconds (adjustable) +- **Commit overhead:** ~50ms per check +- **Memory:** ~64MB (limited) +- **CPU:** ~10% max + +--- + +Created: 2026-04-26 diff --git a/git-auto-sync.service b/git-auto-sync.service new file mode 100644 index 0000000..967e4a4 --- /dev/null +++ b/git-auto-sync.service @@ -0,0 +1,36 @@ +[Unit] +Description=Git Auto-Sync for Second Brain Vault +After=network.target +Documentation=file:///workspace/second-brain/README.md + +[Service] +Type=simple +User=intense +WorkingDirectory=/workspace/second-brain + +# Environment +Environment="VAULT_PATH=/workspace/second-brain" +Environment="COMMIT_AUTHOR=Bumblebee AI" +Environment="COMMIT_EMAIL=bumblebee@clawd.local" +Environment="POLL_INTERVAL=30" + +# Run auto-sync script +ExecStart=/bin/bash /workspace/second-brain/git-auto-sync.sh + +# Restart policy +Restart=always +RestartSec=10 +StartLimitInterval=300 +StartLimitBurst=5 + +# Resource limits +MemoryLimit=64M +CPUQuota=10% + +# Logging +StandardOutput=journal +StandardError=journal +SyslogIdentifier=git-sync + +[Install] +WantedBy=multi-user.target diff --git a/git-auto-sync.sh b/git-auto-sync.sh new file mode 100755 index 0000000..54fb97a --- /dev/null +++ b/git-auto-sync.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# Git Auto-Sync: Watch for changes and auto-commit +# Run this in the background to auto-commit changes to vault + +VAULT_PATH="${VAULT_PATH:-.}" +COMMIT_AUTHOR="${COMMIT_AUTHOR:-Bumblebee AI}" +COMMIT_EMAIL="${COMMIT_EMAIL:-bumblebee@clawd.local}" +POLL_INTERVAL="${POLL_INTERVAL:-30}" # Check every 30 seconds + +cd "$VAULT_PATH" || exit 1 + +# Configure git user for commits +git config user.name "$COMMIT_AUTHOR" 2>/dev/null || true +git config user.email "$COMMIT_EMAIL" 2>/dev/null || true + +# Enable auto-stash for merge conflicts +git config rebase.autoStash true 2>/dev/null || true + +echo "🔄 Git Auto-Sync started" +echo "Vault: $VAULT_PATH" +echo "Poll interval: ${POLL_INTERVAL}s" +echo "" + +# Keep track of last commit hash to avoid duplicate commits +LAST_COMMIT="" + +while true; do + sleep "$POLL_INTERVAL" + + # Check for changes + if ! git diff-index --quiet HEAD --; then + # There are unstaged changes + CHANGES=$(git status --short) + + if [ -n "$CHANGES" ]; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Changes detected:" + echo "$CHANGES" | sed 's/^/ /' + + # Stage all changes + git add -A + + # Create commit message with file count + FILE_COUNT=$(echo "$CHANGES" | wc -l) + COMMIT_MSG="Auto-sync: $FILE_COUNT files updated" + + # Commit + if git commit -m "$COMMIT_MSG" --no-verify 2>/dev/null; then + echo " ✓ Committed" + LAST_COMMIT=$(git rev-parse HEAD) + + # Try to push (optional, if remote is configured) + if git remote -v | grep -q .; then + if git push -q 2>/dev/null; then + echo " ✓ Pushed to remote" + else + echo " ⚠ Push failed (repo might be local-only)" + fi + fi + fi + fi + fi +done