
Git-repo – Manage Gitlab, GitHub and Bitbucket from the command line - guyzmo
http://i.got.nothing.to/code/on/git-repo:_the_utility_for_services/
======
KZeillmann
I really enjoy how the author broke down both the problem and the solution,
explaining why the existing solutions are inadequate. I often see articles
about new products or new programming languages, and their features, but they
often forget to mention what problem prompted the solution. Why was a new
language invented to solve this problem? Why were the existing solutions
limiting?

Bravo to the author here for making all that information clear and up-front.

~~~
Aldo_MX
> I really enjoy how the author broke down both the problem and the solution,
> explaining why the existing solutions are inadequate.

A thousand times this, I always get frustrated that every single product, tool
or service has to have a lot of marketing gibberish, catchy slogans, etc., but
zero explanations of what problems do they attempt to solve, or what was the
motivation to create them.

You usually are required to dig further in the documentation or look for an
external reference to understand what's the real purpose behind a product,
tool or service.

~~~
guyzmo
thank you a lot for your comments

I actually wrote that tool based on a huge frustration I had going back and
forth to the browser, and not being able to work while being agnostic to the
services, which felt being a totally broken UX. I have then worked on that
tool for a while, used it and refactored it a lot up until I'm happy using it.

All in all, when I'm doing a tool, I'm first doing it for myself (I might
invent the DIFY concept, to override the DIY concept )… only then I'm sharing
it with others.

~~~
mst
The same situation kinda drove me insane too, but I've been happily using -

[https://github.com/ingydotnet/git-hub/](https://github.com/ingydotnet/git-
hub/)

for a while now. It might be interesting to compare and contrast your tooling
and git-hub - ingy's being straight bash, while a little crazy, makes
installation really trivial, but then again yours supports multiple services,
but then again who knows whether the different subcommand syntaxes will work
better or worse for any particular other user.

(also, lest anybody think this is a veiled complaint, I'm sure ingy's reaction
to finding your work exists will be "awesome, the more the merrier" followed
by figuring out if you came up with any features he wants to steal ;)

~~~
guyzmo
Thank you, though pretty close, our approaches are slightly different. My main
focus is use case, I did not implement the social features of a repository,
because those are things that happen happily in a browser.

But project/merge requests/gists are things that have a lot of sense to happen
in the commandline /instead/ of within the browser. So basically, his solution
is more feature complete on the social side, whereas I implemented more the
repository interaction side (like creating gists, or fetching a PR).

So for sure he's got a point for portability being a bash script, but still
python3 is begining to be widespread enough.

I mean, if debian-stable got it, you can consider it's everywhere…

~~~
mst
Not sure if it's something you'd call a social feature, but I find things like
listrepos on an organization to be really helpful for piping into xargs to
checkout everything a new customer depends on.

The PR stuff is so far as I can see complete in git-hub - what do you think
you're missing?

(edit: if you meant gists, lots of the people I know already use paste site
CLIs that handle that, btw, so to -us- that's more a social feature than the
existing functionality is)

~~~
guyzmo
My bad, I did not scroll down to see how complete the command set was. At the
top of the readme the list of commands is misleading (I thought there were
only those at the first read).

I'm not sure I can see a real use for checking out every repo of an
organisation (I mean, if you do that with mozilla, you better start before
going for a long holiday ), but having it /possible/ is a great thing

So I guess we're pretty much alike, git-repo being strong for being service
agnostic, and git-hub being more complete.

Though, in my redesign plan I got for version 2, I have in mind a framework to
make it possible to implement service-specific CLI API, while sharing a same
core CLI API for the service-agnostic features.

So my hope is that people will like the tool enough to participate in the
development and help make the tool more feature complete across the services!

~~~
mst
> I'm not sure I can see a real use for checking out every repo of an
> organisation

Maybe I wasn't explicit about it, but I did (and do) have one:

New customer with a github org and I want everything from their org so I can
have a spelunk through the code while getting up to speed, build out
dependency graphs to get a feel for how things interrelate, etc.

In fact, making it possible to script checking out an org's worth of perl
repositories and shoving them into an
[http://p3rl.org/App::opan](http://p3rl.org/App::opan) instance easily was the
thing that was painful enough for me to finally install git-hub.

So, yeah, it may not be a common use case but it's actually an essential
feature for me. Whether this means you should prioritise stealing it likely
depends on how common it is, which I can't answer :)

------
michaelmior
I use hub[0] to accomplish some of the same things. `hub fork` creates a fork
and sets up a new remote. After pushing to my fork, `hub pull-request` creates
a pull request.

[0] [https://github.com/github/hub](https://github.com/github/hub)

~~~
guyzmo
Well, I saw about hub, but I wasn't happy with the fact that it's a github
only tool, I really wanted a service agnostic tool, and also because the CLI
API was not great. I don't want a tool to replace git, I want it to extend it.

What git-repo really offers is a tool that integrates nicely to the git CLI
(as `git-something` is also available as `git something`, so git-repo acts per
default as `git repo hub…`). And then it autoconfigures the .gitconfig aliases
to have the `git hub`, `git lab`, `git moo` you'd want.

So besides the fact that hub is certainly much more mature than my tool, it
wouldn't be a tool I'd like to really use.

~~~
michaelmior
You can just alias hub to git to solve the first problem. As far as being
service agnostic, that's a fair point. I rarely use anything outside of
GitHub.

------
seschwar
There's also git-spindle for this:

\- [https://seveas.github.io/git-spindle/](https://seveas.github.io/git-
spindle/)

\- [https://github.com/seveas/git-spindle](https://github.com/seveas/git-
spindle)

~~~
guyzmo
what the… ok I totally missed that one! And I _DID_ search before writing such
a tool

~~~
StavrosK
That's what always happens to me as well. I've attributed it to me only half-
heartedly searching, because deep down I just want to write the tool.

~~~
guyzmo
Well, TBH, as an engineer, I hate to reinvent the wheel. I prefer to join and
improve the existing concept with my own ideas to make it the synthesis of
many peoples ideas

You might see on my github that I do that a lot, I'm being some sort of
mercenary of FLOSS projects, as I patch wherever I see a bug or want a new
feature without really caring about the "big plan"

Actually, I wrote the tool because deep down I just want to /use/ the tool.

------
0xmohit

      then you watch the code, create a branch:
      git checkout -b `bugfix/nasty_one`
    

Please remove backticks from the command. What if you called the branch
`poweroff` instead and a naive reader copy/pasted the command into her
terminal?

~~~
icebraining

      poweroff: Need to be root

~~~
0xmohit
One might have sudo privileges configured via /etc/sudoers (It's the default
on AWS EC2 instances!)

~~~
icebraining
Yes, but you still need to call "sudo poweroff", not just "poweroff".

~~~
avhon1
See user chainsaw10. Anecdotally, on my vanilla Arch systems, I can run
"poweroff" without being root, and without sudo, and the computers will end
all processes and turn off.

------
awinter-py
Cool but 'repo' is a really hard name to search.

There's already a tool by this name and they have the same problem.

[https://code.google.com/p/git-repo/](https://code.google.com/p/git-repo/)

~~~
guyzmo
Well, first the name really is `git-repo` not `repo`, and as nobody has really
heard of it yet, the pypi package is already on first page of go, and second
page of google.

I hope that if people like the tool, it's going to be easier to find.

Of course, I'm not really obsessed with the name (as anyway the tool is
designed so the user does not type git-repo everyday ). So if someone comes up
with a name that's great that can be better, I'm all ears!

About the fact that google has that other tool… Well they really are not much
projects using it, beyond the google projects, and the tool really is called
`repo`, not `git-repo`, so the name clash is not really there.

~~~
awinter-py
I think harrow uses it for their builds

------
prh8
I really like that this works for all services interchangeably. Yes, Github
created Hub for this same problem, but I've used Bitbucket at some jobs and
Gitlab personally for some projects. Having something uniform and service
agnostic is great. It's clear the creator thought a lot about this design
feature.

------
lucideer
This is wonderful. I'd guess that this little tiny bit of extra friction is
enough of a disturbance to the workflow for private local/personal/work
projects to prevent many from bothering to contribute back in some cases (I'm
definitely guilty here).

~~~
guyzmo
And I hope also level the game for alternatives to github. Git is distributed
by nature, and we should only be happy to see cross services forks happening!

------
StavrosK
> The git utility has a rather well designed interface to make it easy to
> remember, extend, and/or customize

> (which nobody does, because who remembers the git remote syntax?

I wish we would move on from the "git has good UX" narrative, it's preventing
us from _actually_ improving the UX.

~~~
guyzmo
note that I did not say that git has a good UX, I said it's /rather well
designed/… Maybe should I have emphazised on the /rather/, or used something
stronger like /relatively/ .

But anyway, designing the command line API of my own tool took me enough
headaches — and I'm still not 100% satisfied — to understand how hard it is to
have a consistent and great UX for something that offer as many features as
git does. Though, I'm trying my best to avoid the decade old troll about git's
UX (like vs mercurial)…

In the end, what I try to make clear it's that I'm not trying to replace what
git does, but cluster a bunch of repository actions tied with some service's
API operations.

And I try my best to offer a pleasant UX doing so. But please, help me making
it better!

~~~
StavrosK
I agree with you on everything, except the "easy to remember" part. Git's UI
is very convoluted and inconsistent. Designing a good UI _is_ really hard, but
I see too many people fall into the "I learnt it, so it must be easy!" trap.

Congratulations for making git-repo, by the way! It looks extremely useful.

~~~
guyzmo
Well, for the easy to remember, I might have been presomptuous O:-)

------
gbraad
The name is slightly problematic as Google also released something with the
same name: used for Android to solve the issue with multiple repositories
instead of submodules.

Besides that, looks interesting and I will give it a try!

~~~
guyzmo
Well as I said for another post I'm aware of that. As the google project is
mostly used only for android and chromium, and as the canonical name of the
tool really is /repo/ and not /git-repo/, there's no real name clashing.

The only issue might be my project being shadowed by google and go, but the
more people will like and use the tool I baked with , the more it'll appear on
their first page. So it's not really up to me, but up to you all liking it!

And finally, if someone comes with a nicer better name than what I chose (I
actually did not spend more than 2.42 minutes on the name when I had to mkdir
the project's directory), I might be happy to rename :)

Otherwise, I hope you'll like the tool and send me patches and <3

------
daddykotex
Goood, I'd really like to try it out. I'm tired of opening the browser go to
my fork and create a branch to make a MR/PR for the project I'm working out.

I will really try it out. Thanks!

------
tommieb
What about bitbucket?

I see references to lab and hub, is bitbucket missing?

~~~
guyzmo
Bitbucket support is there. But it's not feature complete, and not up to my
standards…

The issue I have is that I got to implement OAuth2 for bitbucket, because the
privatekey scheme offered by bitbucket does not work for a CLI tool use case.
So currently, the credentials (login/password) of bitbucket are stored in
CLEAR in the configuration file, which really, really sucks…

And some new features (like the snippets) are not implemented in third part
python libraries, because most of the libs are old and unmaintained.

Anyway, following some discussions I had with atlassian bitbucket developers,
bitbucket (like gitlab) is planning to switch to swagger, which will help
automagical generation of client-side feature complete libraries. So I'm
planning to level bitbucket feature set as soon as they land the new API.

So I hope it won't be long before all the features will land for the three
services!

------
pferde
I'm amazed that nobody has commented yet about how this is a CLI wrapper
around web services which are wrappers around a CLI tool. Or is everyone here
already too jaded and so used to piling endless abstractions upon abstractions
that this is considered normal?

How about if people simply accepted patches via e-mail, instead of requiring
those obnoxious github pull requests?

------
Omnipresent
Feature request - Add the ability to create a merge request from command line.
Esp for GitLab

~~~
guyzmo
See the issues, it's already implemented, but not released yet. The issue is
that I also am working on the gitlab snippets… which lacks an API. So I'm
currently working on a patch to add an API to the gitlab snippets, so my tool
can have gitlab snippets!

[https://github.com/guyzmo/git-
repo/commit/59c7ac2cd4c0316016...](https://github.com/guyzmo/git-
repo/commit/59c7ac2cd4c0316016bf8a03c2fbedbc19fe5626)

So pretty soon I hope I'll be able to finish both MR and snippets for gitlab,
and finish the tests and merge all that back to git-repo!

------
erikb
Honestly, I just opened the post to find ridiculous things to criticise. But
in fact this looks like a valid helper. Sure I don't have the same workflow,
but this one seems to work as well. Good work!

------
ponytech
I am using a private gitlab instance. No support for this?

~~~
guyzmo
Yes there is! There's a bug that has been found that crashes the feature, but
I got a patch ready to publish.

~~~
ponytech
Ah sorry, my assumption was based on the config wizard not asking for my URL.
I've found how to do it in the README. Thanks!

~~~
guyzmo
Oh, I need to make a ticket about adding that to the wizard. Be my guest if
you want to :-)

------
adamnemecek
I'm surprised Github et al. haven't tried to contribute some functionality for
doing this to git. The thing described in the article is extremely common.

~~~
azdavis
They have, sort of. [https://hub.github.com](https://hub.github.com)

~~~
adamnemecek
Do you use it?

~~~
azdavis
No, actually, but I did (sort of) reimplement[0] the "git browse" command that
hub gives you.

I'd probably use hub if I was involved in more projects that didn't have me as
the sole developer.

[0]: [https://github.com/azdavis/dotfiles/blob/master/bin/git-
brow...](https://github.com/azdavis/dotfiles/blob/master/bin/git-browse)

~~~
guyzmo
hehe, it's also implemented in git-repo: `git hub open`

------
zymhan
The site is now returning an error. I guess HN killed it?

~~~
guyzmo
nah, I don't think so, I think you might have reloaded as I was recompiling
the blog

------
syngrog66
nice idea. bad name

~~~
guyzmo
thank you. Please suggest a better name! :-D

~~~
Hihi6565
"I'm the C.L.A.I.T commander" :
[https://www.youtube.com/watch?v=bB51NCcvuMs](https://www.youtube.com/watch?v=bB51NCcvuMs)

~~~
guyzmo
<3 I guess you're referring to my other project :-)

