summaryrefslogtreecommitdiffstats
path: root/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'README.md')
-rw-r--r--README.md230
1 files changed, 230 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f6518a9
--- /dev/null
+++ b/README.md
@@ -0,0 +1,230 @@
+[![PyPi version](https://img.shields.io/pypi/v/gita.svg?color=blue)](https://pypi.org/project/gita/)
+[![Build Status](https://travis-ci.org/nosarthur/gita.svg?branch=master)](https://travis-ci.org/nosarthur/gita)
+[![codecov](https://codecov.io/gh/nosarthur/gita/branch/master/graph/badge.svg)](https://codecov.io/gh/nosarthur/gita)
+[![licence](https://img.shields.io/pypi/l/gita.svg)](https://github.com/nosarthur/gita/blob/master/LICENSE)
+[![PyPI - Downloads](https://img.shields.io/pypi/dm/gita.svg)](https://pypistats.org/packages/gita)
+[![Chinese](https://img.shields.io/badge/-中文-lightgrey.svg)](https://github.com/nosarthur/gita/blob/master/doc/README_CN.md)
+
+```
+ _______________________________
+( ____ \__ __|__ __( ___ )
+| ( \/ ) ( ) ( | ( ) |
+| | | | | | | (___) |
+| | ____ | | | | | ___ |
+| | \_ ) | | | | | ( ) |
+| (___) |__) (___ | | | ) ( |
+(_______)_______/ )_( |/ \| v0.10
+```
+
+# 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 compile together, it helps to see their status together too.
+I also hate to change directories to execute git commands.
+
+![gita screenshot](https://github.com/nosarthur/gita/raw/master/doc/screenshot.png)
+
+Here the branch color distinguishes 5 situations between local and remote branches:
+
+- white: local has no remote
+- green: local is the same as remote
+- red: local has diverged from remote
+- purple: local is ahead of remote (good for push)
+- yellow: local is behind remote (good for merge)
+
+The choice of purple for ahead and yellow for behind is motivated by
+[blueshift](https://en.wikipedia.org/wiki/Blueshift) and [redshift](https://en.wikipedia.org/wiki/Redshift),
+using green as baseline.
+
+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`
+- `gita rm <repo-name(s)>`: remove repo(s) from `gita` (won't remove files from disk)
+- `gita group`: show grouping of the repos
+- `gita group <repo-name(s)>`: group repos
+- `gita ungroup <repo-name(s)>`: remove grouping for repos
+- `gita ll`: display the status of all repos
+- `gita ll <group-name>`: display the status of repos in a group
+- `gita ls`: display the names of all repos
+- `gita ls <repo-name>`: display the absolute path of one repo
+- `gita rename <repo-name> <new-name>`: rename a repo
+- `gita info`: display the used and unused information items
+- `gita -v`: display gita version
+
+Repo paths are saved in `$XDG_CONFIG_HOME/gita/repo_path` (most likely `~/.config/gita/repo_path`).
+
+The delegating sub-commands are of two formats
+
+- `gita <sub-command> [repo-name(s) or group-name(s)]`:
+ optional repo or group input, and no input means all repos.
+- `gita <sub-command> <repo-name(s) or groups-name(s)>`:
+ required repo name(s) or group name(s) input
+
+By default, only `fetch` and `pull` take optional input.
+
+If more than one repos are specified, the git command will run asynchronously,
+with the exception of `log`, `difftool` and `mergetool`, which require non-trivial user input.
+
+## Customization
+
+Custom delegating sub-commands can be defined in `$XDG_CONFIG_HOME/gita/cmds.yml`
+(most likely `~/.config/gita/cmds.yml`).
+And they shadow the default ones if name collisions exist.
+
+Default delegating sub-commands are defined in
+[cmds.yml](https://github.com/nosarthur/gita/blob/master/gita/cmds.yml).
+For example, `gita stat <repo-name(s)>` is registered as
+
+```yaml
+stat:
+ cmd: diff --stat
+ help: show edit statistics
+```
+
+which executes `git diff --stat`.
+
+If the delegated git command is a single word, the `cmd` tag can be omitted.
+See `push` for an example.
+To disable asynchronous execution, set the `disable_async` tag to be `true`.
+See `difftool` for 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,
+set the `allow_all` option to be `true`.
+For example, the following snippet creates a new command
+`gita comaster [repo-name(s)]` with optional repo name input.
+
+```yaml
+comaster:
+ cmd: checkout master
+ allow_all: true
+ help: checkout the master branch
+```
+
+Another customization is the information items displayed by `gita ll`.
+The used and unused information items are shown with `gita info` and one can
+create `$XDG_CONFIG_HOME/gita/info.yml` to customize it. For example, the
+default information items setting corresponds to
+
+```yaml
+- branch
+- commit_msg
+```
+
+To create your own information items, define a dictionary called `extra_info_items`
+in `$XDG_CONFIG_HOME/gita/extra_repo_info.py`. It should map strings to functions,
+where the strings are the information item names and the functions take repo path
+as input. A trivial example is shown below.
+
+```python
+def get_delim(path: str) -> str:
+ return '|'
+
+extra_info_items = {'delim': get_delim}
+```
+
+If it works, you will see these extra items in the 'Unused' section of the
+`gita info` output. To use them, edit `$XDG_CONFIG_HOME/gita/extra_repo_info.py`.
+
+## Superman mode
+
+The superman mode delegates any git command/alias.
+Usage:
+
+```
+gita super [repo-name(s) or group-name(s)] <any-git-command-with-or-without-options>
+```
+
+Here `repo-name(s)` or `group-name(s)` are optional, and their absence means all repos.
+For example,
+
+- `gita super checkout master` puts all repos on the master branch
+- `gita super frontend-repo backend-repo commit -am 'implement a new feature'`
+ executes `git commit -am 'implement a new feature'` for `frontend-repo` and `backend-repo`
+
+## Requirements
+
+Gita requires Python 3.6 or higher, due to the use of
+[f-string](https://www.python.org/dev/peps/pep-0498/)
+and [asyncio module](https://docs.python.org/3.6/library/asyncio.html).
+
+Under the hood, gita uses subprocess to run git commands/aliases.
+Thus the installed git version may matter.
+I have git `1.8.3.1`, `2.17.2`, and `2.20.1` on my machines, and
+their results agree.
+
+## Installation
+
+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 `.bashrc` file.
+
+```
+alias gita="python3 -m gita"
+```
+
+Windows users may need to enable the ANSI escape sequence in terminal, otherwise
+the branch color won't work.
+See [this stackoverflow post](https://stackoverflow.com/questions/51680709/colored-text-output-in-powershell-console-using-ansi-vt100-codes) for details.
+
+## Auto-completion
+
+Download
+[.gita-completion.bash](https://github.com/nosarthur/gita/blob/master/.gita-completion.bash)
+and source it in `.bashrc`.
+
+## Contributing
+
+To contribute, you can
+
+- report/fix bugs
+- request/implement features
+- star/recommend this project
+
+To run tests locally, simply `pytest`.
+More implementation details are in
+[design.md](https://github.com/nosarthur/gita/blob/master/doc/design.md).
+
+You can also make donation to me on [patreon](https://www.patreon.com/nosarthur).
+Any amount is appreciated!
+
+## Contributors
+
+[![nosarthur](https://github.com/nosarthur.png?size=40 "nosarthur")](https://github.com/nosarthur)
+[![mc0239](https://github.com/mc0239.png?size=40 "mc0239")](https://github.com/mc0239)
+[![dgrant](https://github.com/dgrant.png?size=40 "dgrant")](https://github.com/dgrant)
+[![samibh](https://github.com/github.png?size=40 "samibh")](https://github.com/samibh)
+[![wbrn](https://github.com/wbrn.png?size=40 "wbrn")](https://github.com/wbrn)
+[![TpOut](https://github.com/TpOut.png?size=40 "TpOut")](https://github.com/TpOut)
+[![PabloCastellano](https://github.com/PabloCastellano.png?size=40 "PabloCastellano")](https://github.com/PabloCastellano)
+[![cd3](https://github.com/cd3.png?size=40 "cd3")](https://github.com/cd3)
+
+## Other multi-repo tools
+
+I haven't tried them but I heard good things about them.
+
+- [myrepos](https://myrepos.branchable.com/)
+- [repo](https://source.android.com/setup/develop/repo)
+