Skip to content

Bidirectional Git Sync

Automatically synchronize content between your WordPress dashboard and a Git repository. Changes flow both ways — edit in WordPress and it pushes to Git, push to Git and WordPress picks it up.

How It Works

Dashboard Edit                    Git Repository
     │                                 │
     ▼                                 ▼
AutoExporter                      SyncManager
  • Save as .md                    • git pull
  • Update _index.json             • git diff --name-status
  • git commit + push              • Process A/M/D/R files
     │                                 │
     ▼                                 ▼
  GitHub Repo  ◄──────────────►  WordPress Site

Dashboard → Git (Auto-Export)

When a post is created or updated in the WordPress admin:

  1. Export: The post content and metadata are saved as a .md file in the content directory
  2. Index: The _index.json manifest is incrementally updated (~10ms)
  3. Commit: Changes are committed with an auto-generated message
  4. Push: The commit is pushed to the configured Git remote

Git → WordPress (Auto-Import)

When changes are pushed to the Git repository:

  1. Webhook: GitHub sends a push event to your WordPress webhook endpoint
  2. Pull: SyncManager runs git pull to fetch new commits
  3. Diff: Parses git diff --name-status to identify changed files
  4. Process: Each file is processed based on its status:
  5. A (Added): New .md file → added to _index.json
  6. M (Modified): Updated .md file → updated in _index.json
  7. D (Deleted): Removed .md file → removed from _index.json
  8. R (Renamed): Old entry removed, new entry added

Setup

1. Configure Git Remote

In site-config.ini:

[github]
repo_url = "https://github.com/your-org/your-content-repo.git"
branch = "main"
auto_push = true
auto_sync = true

2. Set Up Webhook (for Git → WordPress)

  1. Go to your GitHub repository → Settings → Webhooks
  2. Add webhook:
  3. URL: https://yoursite.com/wp-json/praison/v1/webhook
  4. Content type: application/json
  5. Events: Push events
  6. Secret: Match the secret in your site-config.ini

3. Enable Auto-Export (for Dashboard → Git)

In WordPress admin → PraisonPress → Settings: - Enable Auto-export on publish - Enable Auto-push to Git

Or in site-config.ini:

[export]
auto_export = true
auto_push = true

File Statuses

Action .md File _index.json Git
Create post in dashboard Created Entry added Commit + push
Update post in dashboard Updated Entry updated Commit + push
Trash post in dashboard Deleted Entry removed Commit + push
Delete post permanently Deleted Entry removed Commit + push
Untrash post in dashboard Restored Entry re-added Commit + push
Push new .md to Git — Entry added Already in Git
Push modified .md to Git — Entry updated Already in Git
Delete .md from Git — Entry removed Already in Git

Concurrency Safety

All index operations use file locking (flock()) to prevent corruption:

  • Multiple pods can safely update the index simultaneously
  • Atomic file renaming ensures partial writes never corrupt the index
  • Lock files are automatically cleaned up

Performance

Operation Time Complexity
Add/update single entry ~10ms O(1) amortized
Remove single entry ~5ms O(1) amortized
Full index rebuild ~30s (18K files) O(N)

The incremental approach means you almost never need a full rebuild — each individual post change is handled in milliseconds.