Anvil
█████╗ ███╗ ██╗██╗ ██╗██╗██╗
██╔══██╗████╗ ██║██║ ██║██║██║
███████║██╔██╗ ██║██║ ██║██║██║
██╔══██║██║╚██╗██║╚██╗ ██╔╝██║██║
██║ ██║██║ ╚████║ ╚████╔╝ ██║███████╗
╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═══╝ ╚═╝╚══════╝
Create isolated multi-repository workspaces for engineering tasks.
Installation
uv tool install git+https://github.com/felixscherz/anvil
Getting started
Create a workspace
Provide a target directory and one or more repository specifiers. Each specifier can be a local path to an existing Git repository or any remote URL accepted by git clone.
anvil create --target /tmp/workspaces/feature-abc \
~/repos/my-service \
git@github.com:org/other-service.git
Anvil will:
- Infer the branch name from the target directory name (
feature-abc). - For local paths — create a
git worktreeon a new branch at the tip of the default branch. - For remote URLs — clone the repository and check out a new branch.
- Write a manifest to
/tmp/workspaces/feature-abc/.anvil/manifest.json.
Example output:
Creating Anvil workspace: /tmp/workspaces/feature-abc
Branch: feature-abc
+ my-service -> /tmp/workspaces/feature-abc/my-service
+ other-service -> /tmp/workspaces/feature-abc/other-service
Created Anvil workspace: /tmp/workspaces/feature-abc
Branch: feature-abc
- my-service -> /tmp/workspaces/feature-abc/my-service
- other-service -> /tmp/workspaces/feature-abc/other-service
Clean up a workspace
anvil clean --target /tmp/workspaces/feature-abc
Anvil reads the manifest, prints a summary, and prompts for confirmation before removing everything.
Anvil workspace: /tmp/workspaces/feature-abc
Branch: feature-abc
Repositories (2):
- my-service (worktree) -> /tmp/workspaces/feature-abc/my-service
- other-service (clone) -> /tmp/workspaces/feature-abc/other-service
Remove Anvil workspace at /tmp/workspaces/feature-abc containing 2 repositories? [y/N]
Skip the prompt with --yes:
anvil clean --target /tmp/workspaces/feature-abc --yes
Add a repository to an existing workspace
anvil add --target /tmp/workspaces/feature-abc ~/repos/another-service
Anvil reads the branch name from the existing manifest (feature-abc) and creates the new repository on that same branch. The manifest is updated in place with the new entry appended. Rollback applies only to repos added in the current run — existing workspace members are untouched.
Notes
- The branch name is derived from the basename of
--target./tmp/workspaces/feature-abc→feature-abc. anvil addreads the branch name from the existing manifest — the target directory name is irrelevant.- The same branch name is created in every repository in the workspace — this is expected and correct.
- If any repository fails during
createoradd, Anvil rolls back only the repos created in that run. - Anvil will refuse to proceed if the target is non-empty, if a derived branch already exists, or if two repositories share the same derived name.
Metadata
Release files for anvil-workspaces 0.1.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 | Actions |
|---|---|---|---|---|
| anvil_workspaces-0.1.0.tar.gz | 35.0 kB | Without provenance | Details for anvil_workspaces-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| anvil_workspaces-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for anvil_workspaces-0.1.0-py3-none-any.whl |
Total release size: 49.8 kB
Release files / anvil_workspaces-0.1.0.tar.gz
| Download URL | anvil_workspaces-0.1.0.tar.gz |
|---|---|
| Size | 35.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4d885934a407f133a1e707b2da903d934b0070db7998a86a710f3ed14c29337c
|
|
BLAKE2b-256 checksum How to use checksums |
bb96f76704990cdcb65b056a04f534899a0756a0d7757fbda906e19cc5b75b7d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","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 / anvil_workspaces-0.1.0-py3-none-any.whl
| Download URL | anvil_workspaces-0.1.0-py3-none-any.whl |
|---|---|
| Size | 14.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
62e397ebfce7b455b2095acfe481d0d2ee918d73be0cd664064245002a269426
|
|
BLAKE2b-256 checksum How to use checksums |
3c6e9dbbf87da2a6b818e1a475598c93445f2eee45d5b2ba57905a89f01a07ce
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.16 {"installer":{"name":"uv","version":"0.11.16","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 anvil-workspaces 0.1.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.