- science and technology
- coding
- hobbies
- productiviy hacks
- mechanical keyboards
- coding
- yoga
Manage many git repos with sanity 从容管理多个git库
License: MIT License
Currently I'm using py3.6 api in asyncio
. They are different in py3.7 and won't even work in py3.10
At some point, we need to update them
https://docs.python.org/3.10/whatsnew/3.10.html
https://www.python.org/dev/peps/pep-0619/ (release schedule)
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
Currently gita rename repo1 repo2
would overwrite repo2
. We should disallow this request and print out some error message.
A minor point, gita rename repo1 repo1
should be allowed.
__main__.py
loops through repos
and calls exec_git
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.
This is an extension of #6
Im thinking of add a sub-command like gita rename <repo-name> <new-name>
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
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?).
To reproduce:
gita rm
to remove all reposgita
commandI 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.
e.g. gita add -r ~/Programming
would recursively search the ~/Programming
directory and auto-add any repos it did not already know about
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.
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!
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.
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 ll
s 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 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>
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
This is the best tool I can found for managing multiple repos!
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.
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.
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
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
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
Right now asyncio.Process.wait
is used, which doesn't block for stdin.
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 ...
_get_repo_status
calculates 4 status properties: dirty, staged, untracked, color. They are independent of each other thus can be easily run in parallel.
This will make gita ll
faster
This case relates to #22
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
.
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.
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
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.
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?
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
Hi and thanks for this useful tool.
Would you consider putting .gita folder under $XDG_CONFIG_HOME instead of creating another folder directly under home?
In #59 the document in README.md is not fully translated to README_CN.md. Specifically, the information item customization is not translated.
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
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'
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!
I wanted to checkout to master branch on all my repos but couldn't find a fast way. Is it possible to skip repository name and run something like gita super checkout master
to run this command on all available repos?
Thx
This can be easily done using gita group
output
group1: [repo1, repo2]
instead of group1: repo1 repo2
util.py
and common.py
, possibly move functionspathlib.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?)A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.