Giter Site home page Giter Site logo

nosarthur / gita Goto Github PK

View Code? Open in Web Editor NEW
1.6K 15.0 72.0 2.3 MB

Manage many git repos with sanity 从容管理多个git库

License: MIT License

Python 95.88% Makefile 0.64% Shell 3.47%
git command-line-tool productivity git-delegation management cli developer-tools command-line terminal

gita's Introduction

PyPi version Build Status codecov licence PyPI - Downloads Gitter Chinese

 _______________________________
(  ____ \__   __|__   __(  ___  )
| (    \/  ) (     ) (  | (   ) |
| |        | |     | |  | (___) |
| | ____   | |     | |  |  ___  |
| | \_  )  | |     | |  | (   ) |
| (___) |__) (___  | |  | )   ( |
(_______)_______/  )_(  |/     \|   v0.16

Gita: a command-line tool to manage multiple git repos

This tool has two main features

  • display the status of multiple git repos such as branch, modification, commit message side by side
  • (batch) delegate git commands/aliases and shell commands on repos from any working directory

gita screenshot

In this screenshot, the gita ll command displays the status of all repos. The gita remote dotfiles command translates to git remote -v for the dotfiles repo, even though we are not in the repo. The gita fetch command fetches from all repos and two of them have updates. To see the pre-defined commands, run gita -h or take a look at cmds.json. To add your own commands, see the customization section. To run arbitrary git command, see the superman mode section. To run arbitrary shell command, see the shell mode section.

I also made a youtube video to demonstrate the common usages Img alt text

The branch color distinguishes 5 situations between local and remote branches:

color meaning
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 and redshift, using green as baseline. You can change the color scheme using the gita color command. See the customization section.

The additional status symbols denote

symbol meaning
+ staged changes
* unstaged changes
? untracked files/folders
$ stashed contents

The bookkeeping sub-commands are

  • gita add <repo-path(s)> [-g <groupname>]: add repo(s) to gita, optionally into an existing group
  • gita add -a <repo-parent-path(s)>: add repo(s) in <repo-parent-path(s)> recursively and automatically generate hierarchical groups. See the customization section for more details.
  • gita add -b <bare-repo-path(s)>: add bare repo(s) to gita. See the customization section for more details on setting custom worktree.
  • gita add -r <repo-parent-path(s)>: add repo(s) in <repo-parent-path(s)> recursively
  • gita clear: remove all groups and repos
  • gita clone <URL>: clone repo from URL at current working directory
  • gita clone <URL> -C <directory>: change to directory and then clone repo
  • gita clone -f <config-file>: clone repos in config-file (generated by gita freeze) to current directory.
  • gita clone -p -f <config-file>: clone repos in config-file to prescribed paths.
  • gita context: context sub-command
    • gita context: show current context
    • gita context <group-name>: set context to group-name, all operations then only apply to repos in this group
    • gita context auto: set context automatically according to the current working directory
    • gita context none: remove context
  • gita color: color sub-command
    • gita color [ll]: Show available colors and the current coloring scheme
    • gita color reset: Reset to the default coloring scheme
    • gita color set <situation> <color>: Use the specified color for the local-remote situation
  • gita flags: flags sub-command
    • gita flags set <repo-name> <flags>: add custom flags to repo
    • gita flags [ll]: display repos with custom flags
  • gita freeze: print information of all repos such as URL, name, and path. Use with gita clone.
  • gita group: group sub-command
    • gita group add <repo-name(s)> -n <group-name>: add repo(s) to a new or existing group
    • gita group [ll]: display existing groups with repos
    • gita group ls: display existing group names
    • gita group rename <group-name> <new-name>: change group name
    • gita group rm <group-name(s)>: delete group(s)
    • gita group rmrepo <repo-name(s)> -n <group-name>: remove repo(s) from existing group
  • gita info: info sub-command
    • gita info [ll]: display the used and unused information items
    • gita info add <info-item>: enable information item
    • gita info rm <info-item>: disable information item
  • gita ll: display the status of all repos
  • gita ll <group-name>: display the status of repos in a group
  • gita ll -g: display the repo summaries by groups
  • 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 rm <repo-name(s)>: remove repo(s) from gita (won't remove files on disk)
  • gita -v: display gita version

The git 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

They translate to git <sub-command> for the corresponding repos. By default, only fetch and pull take optional input. In other words, gita fetch and gita pull apply to all repos. To see the pre-defined sub-commands, run gita -h or take a look at cmds.json. To add your own sub-commands or override the default behaviors, see the customization section. To run arbitrary git command, see the superman mode section.

If more than one repos are specified, the git command runs asynchronously, with the exception of log, difftool and mergetool, which require non-trivial user input.

Repo configuration global is saved in $XDG_CONFIG_HOME/gita/repos.csv (most likely ~/.config/gita/repos.csv) or if you prefered at project configuration add environment variable GITA_PROJECT_HOME.

Installation

To install the latest version, run

pip3 install -U gita

If you prefer development mode, download the source code and run

pip3 install -e <gita-source-folder>

In either case, calling gita in terminal may not work, then 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 for the branch color to work. See this stackoverflow post for details.

Auto-completion

You can download the generated auto-completion file in the following locations for your specific shell. Alternatively, if you have installed argcomplete on your system, you can also directly run eval "$(register-python-argcomplete gita -s SHELL)" (e.g. SHELL as bash/zsh) in your dotfile.

Bash

Download .gita-completion.bash and source it in shell.

Zsh

There are 2 options :

  • .gita-completion.zsh. Use the help of gita command to display options. It uses the bash completion system for zsh. Add autoload -U +X bashcompinit && bashcompinit in .zshrc and source the zsh file
  • _gita. Completion more Zsh style. Copy it in a folder and add this folder path in FPATH variable. This completion file doesn't take account to command from cmds.json

Fish

Download gita.fish and place it in ~/.config/fish/completions/

Superman mode

The superman mode delegates any git command or 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

Shell mode

The shell mode delegates any shell command. Usage:

gita shell [repo-name(s) or group-name(s)] <any-shell-command>

Here repo-name(s) or group-name(s) are optional, and their absence means all repos. For example,

  • gita shell ll lists contents for all repos
  • gita shell repo1 repo2 mkdir docs create a new directory docs in repo1 and repo2
  • gita shell "git describe --abbrev=0 --tags | xargs git checkout": check out the latest tag for all repos

Customization

define repo group and context

When the project contains several independent but related repos, we can define a group and execute gita command on this group. For example,

gita group add repo1 repo2 -n my-group
gita ll my-group
gita pull my-group

To save more typing, one can set a group as context, then any gita command is scoped to the group

gita context my-group
gita ll
gita pull

The most useful context maybe auto. In this mode, the context is automatically determined from the current working directory (CWD): the context is the group whose member repo's path contains CWD. To set it, run

gita context auto

To remove the context, run

gita context none

It is also possible to recursively add repos within a directory and generate hierarchical groups automatically. For example, running

gita add -a src

on the following folder structure

src
├── project1
│   ├── repo1
│   └── repo2
├── repo3
├── project2
│   ├── repo4
│   └── repo5
└── repo6

gives rise to 3 groups:

src:repo1,repo2,repo3,repo4,repo5,repo6
src-project1:repo1,repo2
src-project2:repo4,repo5

add user-defined sub-command using json file

Custom delegating sub-commands can be defined in $XDG_CONFIG_HOME/gita/cmds.json (most likely ~/.config/gita/cmds.json) And they shadow the default ones if name collisions exist.

Default delegating sub-commands are defined in cmds.json. For example, gita stat <repo-name(s)> is registered as

"stat":{
  "cmd": "git diff --stat",
  "help": "show edit statistics"
}

which executes git diff --stat for the specified repo(s).

To disable asynchronous execution, set disable_async to be true. See the difftool example:

"difftool":{
  "cmd": "git difftool",
  "disable_async": true,
  "help": "show differences using a tool"
}

If you want a custom command to behave like gita fetch, i.e., to apply to all repos when no repo is specified, set allow_all to be true. 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"
}

Any command that runs in the superman mode mode or the shell mode can be defined in this json format. For example, the following command runs in shell mode and fetches only the current branch from upstream.

"fetchcrt":{
  "cmd": "git rev-parse --abbrev-ref HEAD | xargs git fetch --prune upstream",
  "allow_all": true,
  "shell": true,
  "help": "fetch current branch only"
}

customize the local/remote relationship coloring displayed by the gita ll command

You can see the default color scheme and the available colors via gita color. To change the color coding, use gita color set <situation> <color>. The configuration is saved in $XDG_CONFIG_HOME/gita/color.csv.

customize information displayed by the gita ll command

You can customize the information displayed by gita ll. The used and unused information items are shown with gita info, and the configuration is saved in $XDG_CONFIG_HOME/gita/info.csv.

For example, the default setting corresponds to

branch,commit_msg,commit_time

Here branch includes both branch name and status. The status symbols are similar to the ones used in spaceship-prompt.

To customize these symbols, add a file in $XDG_CONFIG_HOME/gita/symbols.csv. The default settings corresponds to

dirty,staged,untracked,local_ahead,remote_ahead,diverged,in_sync,no_remote
*,+,?,↑,↓,⇕,,∅

Only the symbols to be overridden need to be defined. You can search unicode symbols here.

customize git command flags

One can set custom flags to run git commands. For example, with

gita flags set my-repo --git-dir=`gita ls dotfiles` --work-tree=$HOME

any git command/alias triggered from gita on dotfiles will use these flags. Note that the flags are applied immediately after git. For example, gita st dotfiles translates to

git --git-dir=$HOME/somefolder --work-tree=$HOME status

running from the dotfiles directory.

This feature was originally added to deal with bare repo dotfiles.

Requirements

Gita requires Python 3.6 or higher, due to the use of f-string and asyncio module.

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.

Tips

effect shell command
enter <repo> directory cd `gita ls <repo>`
delete repos in <group> gita group ll <group> | xargs gita rm

Contributing

To contribute, you can

  • report/fix bugs
  • request/implement features
  • star/recommend this project

Read this article if you have never contribute code to open source project before.

Chat room is available on Join the chat at https://gitter.im/nosarthur/gita

To run tests locally, simply pytest in the source code folder. Note that context should be set as none. More implementation details are in design.md. A step-by-step guide to reproduce this project is here.

You can also sponsor me on GitHub. Any amount is appreciated!

Other multi-repo tools

I haven't tried them but I heard good things about them.

gita's People

Contributors

anon-artist avatar bcdiaconu avatar blurayne avatar cd3 avatar dependabot-preview[bot] avatar dgrant avatar dzhou-schrodinger avatar elcorto avatar ewu63 avatar franzs avatar gbloquel avatar gitter-badger avatar jmourelos avatar johnnybeckett avatar jplourenco1 avatar mcebular avatar nosarthur avatar pablocastellano avatar samibh avatar sebastien-rosset avatar sikmir avatar soraxas avatar stevexyh avatar tpout avatar turiok avatar xywei avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gita's Issues

display output in some succinct mode

gita fetch and gita pull could create a lot of screen output, which is not particularly useful (I never looked at them myself). It would be nice to have a succinct output.

@seqizz suggested to use progress bars for the updated repos, like docker pull output. For example,

reponame  branch  ###==== Updating...
reponame2  branch  ######## Failed (There is no tracking information for the current branch.)
reponame3  branch  ######## Done (2 new branches fetched, 1 file changed, 46 insertions(+))
reponame3  branch  ######## Done (Already up-to-date)
reponame4  branch  ######## Done (2 file changed, 12 insertions(+), 4 deletions(-))

I think this is very neat. However, it's not clear to me how to compute the progress. Please leave a comment if you have any ideas.

As for the bookkeeping of which subcommands are in succinct mode, we can introduce another tag in the yaml configuration file, say succinct_output or something that gives a good description of the final implementation. Then users can personalize their preferences, e.g., overriding default behavior, controlling their custom command (is it possible to have a universal solution to compute progress/summaries?).

Add sub-commands for `gita group`

IMO the command syntax is confusing - you have to pass a list of groups before you get any indication that a name will be requested. I spent 4-5min reading the help text thinking I was missing something, because there was no indication a name would be requested.

At a minimum, update the help text to say "You will be prompted for the group name". However, ideally you woudl support a --name arg before the positional args, so the entire command could be scripted if needed

add `gita ll`

gita ll will behave like the current gita ls
gita ls will only show the repo names, thus can be used for the bash auto completion script directly

Add 'workspace' or 'team' grouping

I work across multiple teams on the overall product, but each team has its own set of repos. Being able to create a grouping so that gita ll or gita ls would only show the repos in that group/team/workspace would bbe useful.

E.g.

T1_repo1
T1_repo2
T1_repo3
T2_repo1
T2_repo2
T2_repo3
T2_repo4

gita addteam t1
gita addteam t2
gita setteam t1

gita ls

T1_repo1
T1_repo2
T1_repo3

gita setteam t2

gita ls

T2_repo1
T2_repo2
T2_repo3
T2_repo4

error after upgrade to 0.10.2

I upgraded gita from 0.9.7 to 0.10.2 , but now I can only get this response by ANY command.
Anything wrong with config?

Traceback (most recent call last): File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/runpy.py", line 193, in _run_module_as_main "__main__", mod_spec) File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/runpy.py", line 85, in _run_code exec(code, run_globals) File "/usr/local/lib/python3.7/site-packages/gita/__main__.py", line 224, in <module> main() # pragma: no cover File "/usr/local/lib/python3.7/site-packages/gita/__main__.py", line 135, in main choices=utils.get_repos(), File "/usr/local/lib/python3.7/site-packages/gita/utils.py", line 34, in get_repos path, name = line.split(',') ValueError: not enough values to unpack (expected 2, got 1)

Python version : Python 3.7.3
OS : macOS 10.14.5

Switch to click?

First: Nice tool! As owner of a framework coming with dozens of modules, i built my own tools (forage) to do stuff on multiple folders already, but gita helps so much more with git repositories, thanks!

Now, i propose switching from argparser to the wonderful click library, because i constantly need to hit up gita's documentation to remember what the symbols and colours on the ll command refer to. I wanted to add this to lls help page, but i don't even know if this is possible with argparse. With click, you just add it to the commands docstring.

If you're open to this, i'd gladly contribute towards the switch.

Is there any homebrew formula for it

I don't see any homebrew formula for gita, do we have any plans to have homebrew formula for it.

I can work on it, thought of confirming before I start on it.

Well done!

This is the best tool I can found for managing multiple repos!

ModuleNotFoundError: No module named 'yaml'

Hello, I installed via pip3 (on a mac) and when I try to run it I get this error

$ gita
Traceback (most recent call last):
  File "/usr/local/bin/gita", line 7, in <module>
    from gita.__main__ import main
  File "/usr/local/lib/python3.7/site-packages/gita/__main__.py", line 2, in <module>
    import yaml
ModuleNotFoundError: No module named 'yaml'

Error on `gita ll` after rename implemented

Hi, I pulled master and rebuilt (pip3 install -e <gita source dir>), and I now get a ValueError when running gita ll:

Traceback (most recent call last):
  File "/home/morten/.local/bin/gita", line 11, in <module>
    load_entry_point('gita', 'console_scripts', 'gita')()
  File "/home/morten/workspace/gita/gita/__main__.py", line 128, in main
    choices=utils.get_repos(),
  File "/home/morten/workspace/gita/gita/utils.py", line 52, in get_repos
    path, name = d.split(',')
ValueError: not enough values to unpack (expected 2, got 1)

I ran a quick git bisect and 2684120 (add rename sub-command) seems to be the commit that introduced the error. I haven't investigated any further, just wanted to let you know.

Suggest explicitly specifying encoding parameter when reading README.md in setup.py

Installation via pip fails for me. The error message implies that the open library function defaults to locale-related encoding scheme, which is gbk on my computer, and fails when encountering the Chinese characters in README.md. Less technologically-inclined people might feel clueless finding cause to the problem. So I suggest we explicitly specifying the encoding scheme utf-8 when reading README.md in setup.py. The change, though small, might improve robustness.

PS: thank you for making such amazing tool!

refactor the code

  • the group yml file should be group1: [repo1, repo2] instead of group1: repo1 repo2
  • separate configure file loading, so in tests group config file and repo config file can be mocked separately
  • give better names to util.py and common.py, possibly move functions
  • increase test coverage to over 90%
  • internally, repos is a dict of {name: path} and redundant path is manually checked, it makes more sense to do {path: name}
  • use pathlib.Path instead of str
  • repo_path needs to be parsed from , separators, which is a pain when new fields are needed. It may be better to use yaml (or json?)
  • use snake case for class methods
  • profile and speed up

https://clig.dev/

Add context sub-command

This is inspired by the taskwarrior

By using

gita context project1

only repos in project1 will be shown from this point on. For example gita ll only shows repos in project1.

Maybe project1 can be a group for now.

To remove the context

gita context none

relates to #82

support custom yml file

add .gita folder at home directory, put gita_path and commands.yml there.

The custom yml shadows the default one. This way, the user can define custom git shortcuts.

Add group support in superman mode

Would it be possible to allow the user to specify a group when using the superman mode? For example to checkout master for all repos under a certain group, or to issue git pull.

Subcommand to move to git repo directory

I was using gita for a while, at-times I have move to git repo, if I have too many operation to perform on git repo. so was thinking to have a command by which which I can directly switch from anywhere to git repo.

Current workflow

gita ls <repo>
cd <repo>

Was thinking of having command like

gita cd <repo>

What opinions do you guys have on it.

Allow multiple repos with the same directory name

Saw this on HN, looks cool.

I have some repos that have different names upstream, but are cloned into folders of the same name (different parent folders, so I have something like foo/myrepo and bar/myrepo). gita only lets me add one of those repos (seems to remove the previous when I add a new with the same folder name). It's also hard to see which of the two is actually added to gita. How about by default using the upstream repo name as the repo's display name in gita, instead of the name of the folder it's been cloned into?

Not able to add git worktree directory as repo

Does gita can manage git worktree directories also?

I am using git worktrees to have different branches checked out into different directories at the same time. And would like to manage git worktree directories also with gita.

Tried, gita add <path-of-work-tree-dir> but seeing the following error:
No new repos found!

Possible to add bare repos?

Is it possible to add bare repos to gita?

For example, i have the following:

alias dotgit="git --git-dir=$HOME/somefolder --work-tree=$HOME"

I'm unable to add the folder to gita though with gita add <foldername>

Workspace - specific repo configs

Hey, first of all thanks for all the good work. You have saved me countless hours managing multi repo projects.

I was thinking of adding a feature to have workspace-specific repo configurations so different workspaces have different list of repos.

Should be pretty straightforward to implement via a recursive check for a ".gita" config file or similar.

More than happy to do a pull request for this what do you think?
Thanks.

add 'group' sub-command

I usually add many repos to gita and some of them are related. Right now all repos are sorted by name in the gita ll display. It'll look nicer if related repos are next to each other.

The group sub-command has the form of

gita group <repo-names>

It writes a group number into the repo_path file for bookkeeping. And the gita ll will look like

┌ repo1 new-feature arstarsta
│ repo2 new-feature arstarsta
└ repo3 new-feature arstarsta
   repo-x master arstarsta
   repo-xxx fix-bug arstarsta
┌ repo-y master arstarsta
└ repo-z master arstarsta

Output showing escape code instead of being colored in Powershell

When using the ll command, the name of the branch is supposed to have a specific color based on its status.

In Powershell, this is not the case. Instead, it shows the escape sequence of the color, as seen in this screenshot:
image

This was working correctly in version 0.6.5

expose `allow_all` mode to customization

Currently one can use custom cmds.yml to register commands/aliases that require repo-name(s). But one cannot register them like gita fetch which requires no repo-name(s), and applies the command to all repos.

The scope of this ticket is to expose a tag in the yaml file to allow such customization.

long directory names produce ugly output

Having a long directory name in the list of repositories produces misaligned output:

> gita ls
project-1         master *_  [COMMIT MESSAGE]
project-2         master     [COMMIT MESSAGE]
reallylong-projectnamemaster     [COMMIT MESSAGE]

Would be good if project-1 and project-2 would have more space dynamically.

Command for mass-clone

Hi,

thank you so much for gita, it's a very nice tool.

The one thing I'm missing is a "clone" command. I'd like to have a list of URLs in the config file of gita, together with the location it should clone them on the filesystem. This would allow me to do a 'gita clone' which then would clone all these repositories (if not already existing).

Use-case: when re-installing a system, a 'gita clone' would be enough to be ready again.

Regards,
Daniel

gita hangs after 'gita pull' when password is needed for multiple repos

When I type 'gita pull', gita pulls the latest changes but then hangs and doesn't go back to the command line. Need to 'Ctrl + C' to escape.

Exception ignored when trying to write to the signal wakeup fd:
OSError: [Errno 9] Bad file descriptor
Traceback (most recent call last):
File "/bin/gita", line 11, in
load_entry_point('gita==0.8.4', 'console_scripts', 'gita')()
File "/lib/python3.6/site-packages/gita/main.py", line 170, in main
args.func(args)
File "/lib/python3.6/site-packages/gita/main.py", line 73, in f_git_cmd
utils.run_async(path, cmds) for path in repos.values())
File "/lib/python3.6/site-packages/gita/utils.py", line 157, in exec_async_tasks
loop.run_until_complete(asyncio.gather(*tasks))
File "/backup/Software/apps_rh/python-3.6/lib/python3.6/asyncio/base_events.py", line 454, in run_until_complete
self.run_forever()
File "/backup/Software/apps_rh/python-3.6/lib/python3.6/asyncio/base_events.py", line 421, in run_forever
self._run_once()
File "/backup/Software/apps_rh/python-3.6/lib/python3.6/asyncio/base_events.py", line 1395, in _run_once
event_list = self._selector.select(timeout)
File "/backup/Software/apps_rh/python-3.6/lib/python3.6/selectors.py", line 445, in select
fd_event_list = self._epoll.poll(timeout, max_ev)
KeyboardInterrupt

async calls for `gita ll`

Retrieving status information from individual repos is embarrassingly parallelizable.

Not sure if this would require a lot of changes though. Some commands are run with os.system and some with subprocess. Maybe it's not really worth the trouble ...

add `gita reset` and `gita tag` subcommands

The format is

gita reset <repo name(s)>
gita tag <repo name(s)>

For gita tag, the delegated command is git tag -n (I find it more informative than git tag)

Also update README.md, and change setup.py to bump up version by 0.0.1

Better handling of KeyboardInterrupts

When the user wants to cancel e.g. the ll command using Ctrl+C, a stack trace is shown. This should be handled in a more user friendly way, hiding the stack trace away and maybe showing a message that the execution was cancelled.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.