- MCP server with stdio transport for local use - Search episodes, transcripts, hosts, and series - 4,511 episodes with metadata and transcripts - Data loader with in-memory JSON storage 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
223 lines
19 KiB
Plaintext
223 lines
19 KiB
Plaintext
Episode: 2130
|
|
Title: HPR2130: Git push to two repositories at once
|
|
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr2130/hpr2130.mp3
|
|
Transcribed: 2025-10-18 14:40:23
|
|
|
|
---
|
|
|
|
This is HPR episode 2,130 entitled Get Pushter 2 Repositories at once.
|
|
It is hosted by Klaatu and is about 24 minutes long.
|
|
The summer is.
|
|
Klaatu demonstrates how to perform one Get Pushter 2 separate repositories.
|
|
This episode of HPR is brought to you by AnanasThost.com.
|
|
Get 15% discount on all shared hosting with the offer code HPR15.
|
|
That's HPR15.
|
|
Better web hosting that's honest and fair at AnanasThost.com.
|
|
You're listening to HPR15.com, my name is Klaatu and on this episode I want to talk about
|
|
Get Pushter 2 separate repositories at the same time.
|
|
This is a little bit of a niche issue I guess and specifically for me I only have had
|
|
to deal with it because some people out there wanted access to some of my code but they
|
|
couldn't be bothered to go to get lab to go get it.
|
|
Most of my public get repositories that I host publicly are located on get lab.
|
|
They used to be located on getorious but getorious.org went away sort of dissolved it just kind of
|
|
evaporated and as part of their sort of parting farewell they told everyone hey you should
|
|
go to getlab.com and put your stuff there instead.
|
|
This getlab.com had built a little importer where you just put in your getorious.org URL
|
|
and click a button and it just imports everything for you.
|
|
That was just kind of like the obvious and easy route so I went to getlab.com.
|
|
In addition getlab.com was the only sort of major sort of public kind of obvious choice
|
|
that was open source from top to bottom.
|
|
Getlab has a non open source version.
|
|
They're one of those sort of open core companies or whatever where they most of what they
|
|
offer is open source in the community edition and then there's like the paid for edition
|
|
where they give you a couple of fancier features and I think most of their fancy features
|
|
specifically are for continuous integration.
|
|
I could be wrong.
|
|
That might have even made it into the community edition at this point but it's not really
|
|
that big of a deal and I'm not sure how well that's even working for them.
|
|
I mean not that they're not doing well.
|
|
They seem to be doing quite well and in fact I use getlab extensively at a job.
|
|
That's kind of how I got used to their interface and the whole concept of doing get through
|
|
a web interface which is annoying but it is something that a lot of people do seem
|
|
to like for whatever reason.
|
|
They seem to be doing well and in a funny story at one job that I had they were actually
|
|
trying to pay getlab for something that wasn't on sort of the price list that the sales
|
|
people at getlab had on their computer screen and they literally turned down thousands
|
|
of dollars because they were like we don't have that you know that's not that's not
|
|
on the menu and then so we ended up using the open source the community edition of getlab
|
|
because they wouldn't take our money it was really bizarre one of those sort of eternal
|
|
questions of how you connect with people who need to get rid of some money with people
|
|
who claim to want the money you know it's like sometimes the weirdest thing that's kind
|
|
of like standing the way I mean sure sometimes you just don't know they exist or sometimes
|
|
it would take too much to to connect those two dots but in other cases it's just like
|
|
this McDonald's employee can't find the right button on their cash register and so I
|
|
can't give my money to this place and it's just bizarre that that happens and I wonder
|
|
how much that affects businesses in real life because certainly like with getlab that
|
|
was a real thing that I witnessed myself I wonder if that happens elsewhere I mean
|
|
sometimes I think people don't know that that there's an option like I don't know I wonder
|
|
how many people would pay 60 bucks for Red Hat Enterprise Linux for instance if they knew
|
|
that there was a $60 option available like I don't know but certainly when I discovered
|
|
that there was a $60 option which was like quote self support but you know you get access
|
|
to the Red Hat network and to their to their online support and stuff like that so it's a license
|
|
so if you have to have a license because of your boss or because of whatever then you can get one
|
|
for 60 bucks but a lot of people don't even know that's an option and they're like oh Red Hat's
|
|
like $800 it's kind of interesting so it's a weird problem to have and none of it has anything
|
|
to do with get I'm sorry I got distracted so anyway get get get lab yeah it was open source it was
|
|
kind of the obvious choice to go to from Gatorius so I did that and when I say obvious choice I mean
|
|
it's the it's the obvious choice that is not self-hosting self-hosting was the obvious choice but
|
|
but I do want the code to sort of be able to be found so I'm trying to leverage a public
|
|
server and get lab was just it was more open than get hub so that's kind of why I defaulted to it
|
|
now get hubs big advantage their their primary sort of the thing that they really truly deliver
|
|
is in the form of like if you go to any given get hub repository you'll see that in the right hand
|
|
corner of of the repository page there's a green button that says download or clone and that is
|
|
there that's their big that's their killer feature apparently because people go to your get hub
|
|
page looking for code or whatever and they see the big green button that says clone or download
|
|
and believe it or not that's like that's a big deal now admittedly I get lab their download
|
|
button is is puzzlingly obscured I mean it's not it's not super hard to find but like when you go
|
|
there especially if you are used to seeing a get hub repository interface when you go there like
|
|
when you look for the download button it's it's it's actually pretty hard to find it's not labeled
|
|
with text it's just an icon and the icon is white on white and it's kind of it is in the right
|
|
place like upper right hand corner sort of I mean like that that I guess it is sort of a logical
|
|
place but it's it's it's next to other buttons that you don't know what they mean and yeah it's
|
|
it's harder to find so not really sure why they do it that way but people really love this um
|
|
this green button that get hub has and so when people have asked to um to get code and I've
|
|
directed them to get lab they seem to get really turned off by that they're like get lab oh no not
|
|
get lab that's for you know that's for the geeks or people who know get I guess it's just like
|
|
really it's not that hard but yeah so um what happens is that sometimes I will take a
|
|
repository that is hosted primarily on get lab and then mirror it on get hub so that people can
|
|
can still find the code on get hub isn't that nice of me um in in practice what that meant
|
|
for a while was that I was get pushing to two separate places so get push origin head and then
|
|
get push get hub head and origin would would resolve to get lab because that's kind of like the
|
|
default label for for your initial or your initial repository um and then get hub would be the one
|
|
that I made manually to push to and that was working and it kind of kept them separate and
|
|
and and it was a two step process and it was okay it wasn't it wasn't necessarily perfect
|
|
so I I started to think well how can I make this all just sort of happen at once because it is a
|
|
mirror so I don't want to have to think about it I just want to be able to get push to my primary
|
|
repository and then have everything ripple through to the the the mirror network as it were
|
|
the way that it eventually or that that it initially came to me was to do it with a get hook
|
|
so get hooks or scripts that you can write and kind of manage um usually locally uh in in each
|
|
repository and and it's just it's an auto run script you know so it detects when you do some
|
|
some action like a commit or a push and then it does some action based on what you've done so
|
|
there's a there might be a pre commit a post commit uh post push things like that so I figured
|
|
well I could write a get hook to detect when I've pushed something and then once that push is
|
|
complete it can then kick off a script to push the same thing to my get hub repository my get hub
|
|
mirror and that was kind of an idea but I did a little bit more research and it turns out that it
|
|
it doesn't even have to be that difficult it can be it can be even simpler and that is you can just
|
|
add another push destination to your get config that seems obvious and in fact that is already
|
|
what I did but what you can do is is take your existing origin destination and add another
|
|
destination to it now I'm not saying to do this because this is actually not what I what I chose to
|
|
do there's a there's a variation on this that I that I think is a little bit better but um
|
|
but I mean you could do it you can do a for instance to so if you do a get remote dash v in your
|
|
in a get repository you'll you'll see the the remote locations of of your kind of um you know
|
|
your decentralized get network and by default typically you're going to see like if you're just kind
|
|
of like Joe user and you're just kind of doing the default get stuff then you're going to see
|
|
two entries you're going both of them are going to get the label origin and there'll be something
|
|
like let's say get at get lab.com blah blah blah fetch and origin get at get lab.com blah blah push
|
|
so the fetch one is obviously where you're pulling your your updates from and the push is the
|
|
place where you're pushing your changes to they are very frequently the same address because you're
|
|
working on the same you know from the same sort of origin point although they're not necessarily
|
|
always the same and you can add to these though you don't only have to have two entries so the way
|
|
that you would add and again I'm not saying to do this I'm just saying that this is what you could do
|
|
you can do a get remote set dash URL dash dash add dash dash push origin get at get hub.com blah blah
|
|
so what that does is it's saying I want you to take you know I want you to execute a get remote
|
|
command so get remote and then we the the sub command that we're doing is a set dash URL
|
|
and we're specifying this as an add we'll an add action we're not removing we're adding so dash
|
|
dash add and then we're specifying this as a push destination a push destination rather than like a
|
|
fetch point so dash dash push and then we're labeling it as a member of the origin group so that's
|
|
why we're doing get remote set dash URL dash dash add dash dash push origin and then the the
|
|
the location of our server get at get hub.com blah blah blah and then when you do a get push
|
|
origin head you are no longer just pushing to your get lab repository you are also pushing to your
|
|
get hub repository now there are two caveats about this I'll save the second caveat for later
|
|
because it's pretty universal but one thing to be aware of is that this obviously lumps everything
|
|
into the same group so if you would ever see an occasion where you would want to push to one and
|
|
not the other this would make it well essentially impossible you'd have to remove you have to remove
|
|
one of them in order to push you know so you what I'm saying is that this does not keep it
|
|
very modular this is now creating you know this is sort of cramming two different things into one
|
|
group and treating them basically as the same which might be what you want to do it just doesn't
|
|
feel right to me it feels like I'm taking two separate places and sticking the same label on them
|
|
just for convenience so there's another way to do this a better way to do this and that is to create
|
|
a new group entirely so the first thing that you would want to do is create a new group
|
|
so as I say the default group location is origin if that's what it's called it's not
|
|
that's not a magic word or anything that just happens to be the thing that the get programmers
|
|
the get devs chose you know as your default string when you're creating a repository the place
|
|
where you're pushing to and fetching from gets labeled origin a lot of us tend to forget that
|
|
that's just a generic name you we could rename that we could call it anything we could call it
|
|
food we could call it penguin doesn't really matter it gets called origin as a default
|
|
what for for clarity I think I would probably add a new group first called like get hub
|
|
and you would do that the same way as as you do you know what we just did like well not
|
|
exactly the same so it would be get remote and then you'd say add get hub and then get at get hub
|
|
com slot colon blah blah blah and that would create the group and instantiate that groups
|
|
sort of URL destination as the get hub address so now if you do a get remote dash v you'll see
|
|
that there's an origin entry and the get hub entry so now you've got two places and that's what
|
|
I've been flying with for a long time where I would do a get push origin head wait for that to
|
|
complete and then get push get hub head and then wait for that to complete to two step process
|
|
but at least you've got two separate locations and they're distinct and they're kind of self-standing
|
|
and that works here's how to make that better make a third group that will then encompass both
|
|
so you do a get remote add all get at get lab dot com blah blah blah so that instantiate to the
|
|
group with your default sort of get lab address and it labels it all and then you need to add
|
|
both addresses as your push destination so get remote set dash URL dash dash add dash dash push
|
|
all get at get lab dot com colon slash blah blah blah and then get remote set URL set dash URL
|
|
dash dash add dash dash push all get at get hub dot com blah blah blah so now if you do a get
|
|
remote dash v you should see that you've got three entries or three blocks I should say you
|
|
should have your origin block your which is just your get lab your get hub block which is just
|
|
your get hub and then you're all block which happens to have both your get hub and your get lab
|
|
addresses as it's push destination so now if you do a get push all head then you're pushing your
|
|
changes to both your get lab repository and your get hub repository all in one go but you maintain
|
|
the sort of distinction between origin and get hub and whatever else so that's that's my
|
|
preferred method I think it's the cleaner method you know it's it's the more sort of self documenting
|
|
method you kind of see what's going on and and I think it's also more appropriate I mean
|
|
it's not but I feel like it is because I I don't see the logic I guess in having two push entries
|
|
in in your sort of origin even though there's nothing special about origin and technically speaking
|
|
you certainly can't have to push destinations it doesn't really matter I just happen to find that
|
|
this is a little bit cleaner now the big universal caveat to all of this is that if you're using
|
|
SSH config to manage your or to help you manage your SSH keys for access into your get repositories
|
|
then this method could could fail because of that so I did an episode with on hacker public radio
|
|
about ssa dot ssh slash config it's a config file that you can have in your dot ssh file
|
|
and you can select you know you can define certain defaults on a per host level so you can list a host
|
|
like by name you know like get get hub and then whenever you push to get hub you could say well
|
|
set the well get hub is a bad example so let's say Foo so whenever you push to Foo set the port
|
|
to to to to to instead of to to set the identity file to dot ssh well to till the slash dot ssh slash
|
|
Foo underscore or id underscore Foo dot pub or not pub just id underscore Foo
|
|
um and set the username to uh not clat to instead of clat to something like that and you can do
|
|
that per host it's a very simple config file it it it's changed my life I I use it for everything
|
|
and I use it including uh get hub and get lab and I have different ssh keys on get hub as I do
|
|
on get lab so when I tried this method where I was pushing to both get hub and get lab all in one go
|
|
I kind of assumed that since they necessarily had to be two separate ssh commands running I assumed
|
|
that my ssh config file would be parsed twice but apparently get doesn't do that because the second
|
|
push kept failing I couldn't get you know like get lab would would succeed and then get hub would
|
|
fail and the only thing that I could figure out was that my ssh config was not getting looked that
|
|
twice and what was happening was that the first one that was getting pushed and I don't know
|
|
how it's deciding that I don't know if it's doing it in the order that I provided or if it's
|
|
alphabetical let's just arbitrarily say it was get lab so the first one that was being
|
|
pushed succeeded and then the second one was failing because of ssh validation so what I ended up
|
|
having to do was create a third ssh key or I chose to create a third ssh key and I set the ssh key
|
|
for both get lab and get hub and used that identity file as my authentication so that when I did a
|
|
get push I was using you know whether it was going to get hub or get lab it was essentially
|
|
it was using the same ssh key and it was getting in under under either condition I don't know if that's
|
|
like I don't know if that's my design I don't know if it's just an oversight maybe it's just
|
|
something that I'm not thinking of that I screwed up in my config in the first place I'm not sure
|
|
but it does it's something to be aware of like if you try this and it's not working
|
|
it just it might be because of ssh config now if you're not pushing via ssh then obviously that
|
|
doesn't even that doesn't that's not going to matter one way together more more more often than not
|
|
you're pushing via ssh like let's just let's be honest you're probably pushing via ssh I mean
|
|
even internally at at work I push to the local get servers via ssh you know it's just like
|
|
yes there are other protocols that can that can write to get but no one uses it so you're probably
|
|
using ssh and if you are you do have to just kind of keep in mind that that your ssh key
|
|
may not apply to one repository or you know you might be using different keys for each repository
|
|
whatever keep that in mind and if if when you try this it fails take a look at what ssh key you're
|
|
attempting to use for each login and sort it out that way because get like I say if you're using
|
|
get with the at symbol in your url you're you're using ssh so anything that it's doing is subject
|
|
to a dot ssh config parse at least once apparently not twice so that's something to be aware of
|
|
and to leverage because it it's actually useful but you just have to know that it's that it's happening
|
|
yeah that's I think that's it for me hopefully that helped it's it's probably not something that
|
|
you'll use every day but certainly if you if you feel the need to mirror a get repository and you
|
|
want it to be fairly invisible to you this is a great way to do it thanks for listening
|
|
you've been listening to hecka public radio at hecka public radio dot org we are a community podcast
|
|
network that releases shows every weekday Monday through Friday today's show like all our shows
|
|
was contributed by an hbr listener like yourself if you ever thought of recording a podcast and click
|
|
on our contributing to find out how easy it really is hecka public radio was founded by the digital
|
|
dot pound and the infonomican computer club and it's part of the binary revolution at binrev.com
|
|
if you have comments on today's show please email the host directly leave a comment on the website
|
|
or record a follow-up episode yourself unless otherwise stated today's show is released on the
|
|
creative comments, attribution, share a like, 3.0 lives in
|