Gita: a command-line tool to manage multiple git repos
This tool does two things
- display the status of multiple git repos such as branch, modification, commit message side by side
- delegate git commands/aliases from any working directory
If several repos need to be compiled against each other, it helps to see their status together. I also hate to change directories to execute git commands.
Here the colors denote the 5 situations between local and remote branches:
- white: local branch has no remote branch
- green: local branch is the same as remote branch
- red: local branch has diverged from remote branch
- purple: local branch is ahead of remote branch (good for push)
- yellow: local branch is behind remote branch (good for merge)
The additional status symbols denote
+: staged changes
*: unstaged changes
_: untracked files/folders
The bookkeeping sub-commands are
gita add <repo-path(s)>: add repo(s) to
gita rm <repo-name(s)>: remove repo(s) from
gita(won't remove files from disk)
gita ll: display the status of all repos
gita ls: display the names of all repos
gita ls <repo-name>: display the absolute path of one repo
gita -v: display gita version
Repo paths are saved in
$XDG_CONFIG_HOME/gita/repo_path (most likely
The delegated git sub-commands are of two formats
gita <sub-command> [repo-name(s)]with optional input, and no input means all repos.
gita <sub-command> <repo-name(s)>with required repo name(s) input
By default, only
pull take optional input.
Sub-commands with required input include
If more than one repos are specified, the git command will run asynchronously,
with the exception of
mergetool, which require non-trivial user input.
Custom git commands/aliases can be placed in
And they shadow the default ones if name collisions exist.
Delegation details for the default commands are in
gita stat <repo-name(s)> is registered as
stat: cmd: diff --stat help: show edit statistics
git diff --stat.
If the delegated git command is a single word, the
cmd tag can be omitted.
push as an example.
To disable asynchronous execution, set the
disable_async tag to be
difftool as an example.
If you want a custom command to behave like
gita fetch, i.e., to apply
command to all repos if nothing is specified,
allow_all option to be
For example, the following snippet creates a new command
gita comaster [repo-name(s)] with optional repo name input.
comaster: cmd: checkout master allow_all: true help: checkout the master branch
The superman mode delegates any git command/alias. Usage:
gita super [repo-name(s)] <command/alias>
repo-name(s) is optional, and absence means all repos.
gita super myrepo1 commit -am 'fix a bug'executes
git commit -am 'fix a bug'for
gita super checkout masterputs all repos on the master branch (also see the customization example)
gita super frontend_repo backend_repo checkout new-featureputs the two chosen repos on the
To install the latest version, run
pip3 install -U gita
If development mode is preferred,
download the source code and run
pip3 install -e <gita-source-folder>.
In either case, calling
gita in terminal may not work,
then you can put the following line in the
alias gita="python3 -m gita"
For auto completion, download
and source it in
To contribute, you can
- report/fix bugs
- request/implement features
- star/recommend this project
To run tests locally, simply
Other multi-repo tools
I haven't tried them but I heard good things about them.