Add Git auto-sync for multi-device vault syncing
This commit is contained in:
+232
@@ -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
|
||||||
@@ -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
|
||||||
Executable
+62
@@ -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
|
||||||
Reference in New Issue
Block a user