polygit
Manage multiple git repos from a single .pgit config file.
uv tool install polygit
Usage
pgit sync # clone missing repos, fetch all
pgit status # show repos with uncommitted changes
pgit pull # pull all repos, auto-stashing local changes
pgit push # interactively commit and push dirty repos
pgit repos # discover drift between .pgit and the filesystem
Configuration
Create a .pgit file in the root directory that contains your repos:
github:
your-username:
repo-one:
repo-two:
some-org:
their-repo: {remote: "some-org/their-repo"}
gitlab:
your-namespace/group:
private-repo:
another-repo:
pgit discovers this file by walking up from the current directory — so running pgit status anywhere inside your repos root just works.
Remote overrides
If a repo is cloned to a local path that differs from its remote path, use the remote key:
github:
my-local-name:
project: {remote: "upstream-org/project"}
push modes
pgit push # prompt for a message per repo (default)
pgit push --all # one message for all dirty repos
pgit push --wip # auto-commit with "WIP <timestamp>"
dry run
pgit pull --dry-run # show ahead/behind per repo; changes nothing
pgit push --dry-run # list dirty repos that would be committed and pushed
pull --dry-run compares against the last fetched state of each upstream, so run pgit sync first for current numbers.
status --json
pgit status --json # machine-readable list of dirty repos
Prints a single JSON array on stdout and nothing else:
[{"platform": "github", "path": "gschaetz/mousehat", "changed_files": 2}]
changed_files is the number of entries in git status --short. Clean repos are omitted, so the array is empty when there is nothing to commit.
repos — drift detection
pgit repos compares what's actually on disk against your .pgit config and reports:
- Remote mismatch — repo is at the right path but the git remote differs (e.g. SSH vs HTTPS)
- Wrong location — remote is tracked in
.pgitbut cloned to a different directory - Untracked — repo on disk not referenced in
.pgitat all - Missing — in
.pgitbut not yet cloned (runpgit sync)
It then offers to update .pgit or rename directories interactively.
Migrating from repos.yaml
If you were using the sync.sh predecessor, rename your repos.yaml to .pgit — the format is identical.
Requirements
- Python 3.8+
- git
Metadata
Release files for polygit 0.5.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| polygit-0.5.0.tar.gz | 29.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| polygit-0.5.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 41.3 kB
Release files / polygit-0.5.0.tar.gz
| Download URL | polygit-0.5.0.tar.gz |
|---|---|
| Size | 29.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e303a24a6acc1e50b43c2e257a1b1a1db6dede7e5f3f58c263b54b03c718925e
|
|
BLAKE2b-256 checksum How to use checksums |
3910393669b52d6a3a957ed783d8b41ab7e7e25aea46b4f4a056ea0371b1439b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / polygit-0.5.0-py3-none-any.whl
| Download URL | polygit-0.5.0-py3-none-any.whl |
|---|---|
| Size | 11.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
556309f974b188a7214abe72e33405560aeef6d2b07f1a88459296deaa14892b
|
|
BLAKE2b-256 checksum How to use checksums |
f597ad5b419a983ec6605d9e0f71c1dd938f7bd9bdd809beae60fde3f3d8f1c4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for polygit 0.5.0
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.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.