git-project - The extensible stupid project manager
Installation
pip install git-project pip install git-project-core-plugins
git-project needs Python 3.10 or later.
Overview
git-project is a git extension for managing development work in a git repository. By itself it does almost nothing. It provides -h, --version and --menu, and plugins provide the commands.
git-project-core-plugins provides the basic commands, among them clone, init, worktree, branch, run and config. Install it alongside git-project.
git-project aims to make switching between tasks in a repository fast, without losing the state of the tasks you set aside. For example, the core plugins can give each worktree its own build directory, so moving to another worktree does not rebuild everything.
Projects
git-project runs under the name of a link to it, and that name selects the active project. If git-fizzbin is a symlink to git-project, then git fizzbin <command> runs git-project with fizzbin as the active project. Run as git-project itself, the active project is project. These docs write git <project> for whichever name you use.
Create the link yourself, in a directory on your PATH:
ln -s "$(command -v git-project)" ~/.local/bin/git-fizzbin
Each project keeps its settings apart from the others, so one repository can hold several projects, each run through its own link.
Configuration
git-project stores its settings in the repository’s git config. A project’s settings live in a section named after the project. git-project changes . and _ in the name to -, so the project fizz_bin uses the section fizz-bin.
Whenever they are missing, git-project sets two values in the project section: branch, the repository’s main branch, and remote, which is origin.
Plugins keep their own settings in subsections of the project section. For example, a project with one worktree might hold:
[fizzbin]
branch = main
remote = origin
srcdir = /src
[fizzbin "worktree.main"]
builddir = {srcdir}/build
A key can hold more than one value. On every run, git-project also checks the config file and stops if one section holds the same key = value line twice.
Scopes
A scope is a subsection that a plugin makes active for the current run. While a scope is active, a value set in the scope overrides the same key in the project section. For example, when you run inside a worktree, the core plugins’ worktree plugin makes that worktree’s subsection a scope. A value set for one worktree then applies only there.
The name of an active scope is also a substitution variable, and its value is the scope’s identifier. In the example above, {worktree} is main inside the main worktree.
Substitution
Some values are substituted before they are used, for example the commands that the run plugin runs. Substitution replaces {name} with the value of name. A name can be:
a key in the project section
a key in the object being substituted, or in an active scope
the name of an active scope, as above
one of these built-in names
- project
The active project’s section name
- branch
The checked-out branch, or during a rebase the branch being rebased
- gitdir
The repository’s git directory
- git_common_dir
The git directory that all worktrees share
- git_workdir
The root of the current worktree
Substitution repeats until the value stops changing, so a value can name another value that itself contains {name}. A value may not name itself. To write a literal brace, write {{} for { and {}} for }. A name is ASCII letters, digits and underscores, and does not start with a digit. Other text in single braces, such as {x.upper()} or {}, stays as written, but a doubled {{ or }} becomes one brace. A name that is not defined is an error.
Substitution inserts each value as written, and the run plugin runs its commands through a shell. Treat the git config as code, and do not include config from a source you do not trust.
Getting help
git <project> -h lists the commands that the installed plugins provide. Use -h there, because git turns git <project> --help into a request for a man page. After a command name --help works as usual, and with the core plugins installed git <project> help <command> shows a command’s full manual.
--menu lists a command’s subcommands, arguments and options in a form meant for tools.
License
git-project is distributed under the terms of the GNU Affero General Public License v3.0 or later.
Metadata
Release files for git-project 0.0.41
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| git_project-0.0.41.tar.gz | 67.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| git_project-0.0.41-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 129.7 kB
Release files / git_project-0.0.41.tar.gz
| Download URL | git_project-0.0.41.tar.gz |
|---|---|
| Size | 67.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e6843a7215bbbedfe6c42bdc9843f0f96fadc1515085cbda3a816d9534371759
|
|
BLAKE2b-256 checksum How to use checksums |
8d9e4b2f1460d55c7cfc98339db14b8df9a8b19a898e3db9455336a2023d7468
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / git_project-0.0.41-py3-none-any.whl
| Download URL | git_project-0.0.41-py3-none-any.whl |
|---|---|
| Size | 62.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5635fb6c23c6b65bb7f9d5f4598659acf641b38b981e6080d44e8ead40f8c150
|
|
BLAKE2b-256 checksum How to use checksums |
d014e8cee544d48509535f0da6e86762d320612b6d5c74a0b9b6333b26d91cd8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|