The Lupaxa GitHub Toolbox
Part of The Lupaxa Project
lupaxa-github-repo-sync
A command-line application that clones, organises, and safely synchronises large collections of GitHub repositories from a single declarative YAML, JSON, or JSON5 configuration.
Unlike many repository synchronisation tools, it does not assume every repository can be updated automatically. Each repository is inspected before any Git operation, so only repositories in a safe state are modified.
Features
- Safe repository inspection before synchronisation
- Automatic cloning of missing repositories
- Fast-forward updates where safe
- Protection against unsafe local states
- HTTPS and SSH clone protocols
- YAML, JSON, or JSON5 configuration with inherited defaults
- Multiple GitHub organisations, aliases, and destination paths
- Concurrent clone, update, and status checks (
--workers, default: CPU count) - Ordered per-repository output (alphabetical by GitHub name after load)
- Rich console output with progress reporting
- Configuration validation and synchronisation plan preview
- Status check (optional fetch of tracking refs)
- Transient GitHub SSH retries during bulk sync
- Cross-platform: macOS, Linux, and Windows
Installation
From PyPI
pip install lupaxa-github-repo-sync
Verify the installation:
grs --version
or:
github-repo-sync --version
The shorter grs command is used in the examples below.
From source (development mode)
pip install -e ".[dev]"
Quick Start
Create ~/.github-repo-sync.yaml:
config:
clone_path: ~/Desktop/GitMaster
clone_protocol: ssh
organisations:
- name: the-lupaxa-project
alias: Lupaxa/TheLupaxaProject
repositories:
- name: .github
alias: github
- name: workflows
- name: brand-assets
Local layout resolves to clone_path/<organisation-alias>/<repository-alias-or-name>.
Organisation aliases may be a single directory name or a relative path under clone_path. Repository aliases must remain a single directory name.
If --config is not specified, the application looks for
~/.github-repo-sync.yaml, then .yml, then .json, then .json5. Config
files may be YAML, JSON, or JSON5.
Validate the configuration:
grs --validate
Review the synchronisation plan:
grs --plan
Synchronise your repositories:
grs
Command-Line Interface
Synchronisation is the default operation.
| Command | Description |
|---|---|
grs |
Synchronise all configured repositories. |
grs --validate |
Validate the configuration and exit. |
grs --plan |
Display the resolved synchronisation plan and exit. |
grs --status |
Check repositories for a clean, synchronised state (may fetch tracking refs). |
Use -c FILE / --config FILE to point at a different YAML, JSON, or JSON5 file.
grs --config work.yaml --validate
grs --status --ignore-clean --offline
grs --recover-rewritten-history
grs --workers 8
grs --results-table
Documentation
Online documentation:
Serve the docs locally:
mkdocs serve
Then open the local URL printed by MkDocs in your browser.
Development
Clone the repository and install development dependencies:
pip install -e ".[dev]"
Useful make targets:
make test # run tests
make type # type checking (mypy)
make check # lint, type check, and tests
Metadata
Release files for lupaxa-github-repo-sync 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| lupaxa_github_repo_sync-0.1.4.tar.gz | 47.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lupaxa_github_repo_sync-0.1.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 92.5 kB
Release files / lupaxa_github_repo_sync-0.1.4.tar.gz
| Download URL | lupaxa_github_repo_sync-0.1.4.tar.gz |
|---|---|
| Size | 47.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cbb842a37bd14d59d5b126c2655a480f05b0deaa2ff68ecddcd8786757addfc9
|
|
BLAKE2b-256 checksum How to use checksums |
025be7d2d7185b5c6ec0618021a05d58e12d28f95ba50c215e003b68e1ecee8b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency logRelease files / lupaxa_github_repo_sync-0.1.4-py3-none-any.whl
| Download URL | lupaxa_github_repo_sync-0.1.4-py3-none-any.whl |
|---|---|
| Size | 45.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bf6ddcbb6b7b273a99cd22acb7d886b211a745c007051299608c0c29f71e674c
|
|
BLAKE2b-256 checksum How to use checksums |
2c889c5b4bc739588c0cce704127848922d6f00399e6f9a06167cdff6b2a7a60
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 23, 2026.
Transparency log