
PushPull stores selected WordPress content in a Git repository using a canonical JSON representation instead of raw database dumps.
This project is also documented through a DevOps-focused article series that explains how to efficiently manage a WordPress stack with Bedrock and PushPull, starting here: https://creativemoods.pt/devops-with-wordpress/
This is a beta plugin. It is still under active development, has limited functionality, and currently supports only a narrow subset of the intended PushPull feature set.
The current release supports these managed domains:
PushPull keeps a local Git-like repository inside WordPress database tables and supports the following workflow directly from WordPress admin:
The plugin also includes:
Fetch likely has updates availableCommit + Push All and Pull + Apply All workflows for whole-site bootstrap and deploy flowswp pushpull WP-CLI command surface for status, configuration, domains, and sync operationsThis is an early, focused release. At the moment, PushPull is intentionally limited to:
attachment.json and the binary fileFetch, driven by a configurable recurring check instead of a live provider probe on every page loadIt does not yet manage forms, users, arbitrary wp_options, or arbitrary plugin data.
PushPull does not use WordPress post IDs as repository identity.
For the currently supported managed sets it stores:
manifest.json file for manifest-backed sets that preserves logical orderingattachment.json and the binary filePushPull currently supports GitHub and GitLab repositories.
For GitHub, grant:
For GitLab fine-grained personal access tokens, grant:
Project: ReadBranch: ReadCommit: ReadCommit: CreateRepository: ReadIn PushPull > Settings:
GitHub or GitLab as the providerTest connectionIn PushPull > Domains:
The normal workflow is:
Commit to snapshot the current live managed-set content into the local repositoryFetch to import the current remote branch into refs/remotes/origin/<branch>Pull for the common fetch + merge flow, or Merge manually after fetch when you want review firstApply repo to WordPress when you want the local branch state written back into WordPressPush when you want local commits published to GitHub or GitLabPushPull also performs a lightweight recurring remote-head check and visually highlights Fetch when the latest scheduled check suggests the remote branch has advanced since the last fetch.
For whole-site bootstrap flows, PushPull also supports:
Commit + Push All to snapshot and publish all enabled domainsPull + Apply All to import and apply all enabled domains on a bare target siteIf both local and remote changed, PushPull can persist conflicts, let you resolve them in the admin UI, and then finalize a merge commit.
When pushing to GitLab, PushPull currently linearizes local merge results into a normal commit on the remote branch instead of preserving merge topology. The merged tree content is preserved; only the remote Git history shape is flattened.
PushPull also exposes a wp pushpull command.
Examples:
wp pushpull statuswp pushpull domainswp pushpull config listwp pushpull config set branch mainwp pushpull config enable-domain wordpress_pageswp pushpull commit wordpress_pageswp pushpull pushwp pushpull commit-push-allwp pushpull pull-apply-allIf the configured GitHub or GitLab repository exists but has no commits yet, Test connection will report that the repository is reachable but empty.
In that case, click Initialize remote repository. PushPull will:
You do not need to create the first commit manually on the provider before using PushPull.
AsyncBranchOperationRunner no longer needs provider-specific GitLab staging rehydration logic.PushPull connects to the GitHub or GitLab API for the repository you configure in the plugin settings.
The plugin uses the provider REST API to:
PushPull sends the following information to the configured provider over HTTPS:
In the current release, the managed content sent to the provider is limited to the enabled supported domains: GenerateBlocks Global Styles, GenerateBlocks Conditions, WordPress Block Patterns, WordPress Categories, WordPress Comments, WordPress Menus, WordPress Pages, WordPress Posts, WordPress Tags, WordPress Custom CSS, GeneratePress Elements, explicitly opted-in WordPress Attachments, WordPress core configuration, WPML configuration, generic discovered custom post types and taxonomies, WPML-backed translation management, and Real Media Library-backed media organization.
PushPull does not send your whole WordPress database to the provider. It only sends the managed content represented by the enabled adapters.
GitHub terms of service: https://docs.github.com/en/site-policy/github-terms/github-terms-of-service
GitHub privacy statement: https://docs.github.com/en/site-policy/privacy-policies/github-general-privacy-statement
GitLab terms: https://about.gitlab.com/terms/
GitLab privacy statement: https://about.gitlab.com/privacy/