Skip to main content

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

status, pull and push accept --only <platform> to operate on a single platform (e.g. github) instead of all of them:

pgit status --only gitlab
pgit pull   --only github --dry-run
pgit push   --only gitlab --all

Passing an unknown platform prints an error to stderr and exits 1.

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 .pgit but cloned to a different directory
  • Untracked — repo on disk not referenced in .pgit at all
  • Missing — in .pgit but not yet cloned (run pgit 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.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for polygit 0.6.0
File Size Uploaded Provenance
polygit-0.6.0.tar.gz 30.6 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for polygit 0.6.0
File Interpreter ABI Platform
polygit-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 42.4 kB

Release files / polygit-0.6.0.tar.gz

Download URL polygit-0.6.0.tar.gz
Size 30.6 kB
Tags Source
SHA-256 checksum
How to use checksums
6ea486e223cebd74c89df78a4db056ecd3caaa99f9e1d443a871c80bed0531a2
BLAKE2b-256 checksum
How to use checksums
1b9afcdd54addeb1aa2a4c34490b3203de2a89e3044316dc39bd385523715292
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.6.0-py3-none-any.whl

Download URL polygit-0.6.0-py3-none-any.whl
Size 11.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8e77df4f17016a76e09206eb1db53dde2ad9ecf45c1c8955602ef247b37440b3
BLAKE2b-256 checksum
How to use checksums
cca666a95c3952c77200e03b246b5ce6ca2469ff24f3a6be44f4d1fdbec41069
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.6.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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page