2 minutes
Selfhost your git repositories
I have a few repositories that I don’t want to share with the world or even GitHub, BitBucket or GitLab. Not because they contain top-secret information, but because I believe that we should store and pay for our own data instead of spreading it over dosen of different could platforms.
If you have a private server with ssh access, then this is an easy task. You don’t need any special software or web-gui, but just git and ssh.
Login to your server and run:
$ git init --bare my-repo.git
Locally clone the repo as:
$ git clone address-of-my-server:my-repo.git
Explanation
Step 1. will create a directory containing your repo on the server. It is identical to the .git directory you are used from your local repositories. The --bare
flag instructs git to store just the .git directory without checking out any branches. This is important because you cannot push to a checked-out branch.
Step 2. will ssh to your server and clone the repo. If you don’t use ssh keys, it will also ask you for password. The part after the :
is actually a path of the repo relative to home directory on the server.
I store my repos in ~/repos/
(duh!) directory, so I would use:
$ git clone murerzen.eu:repos/my-repo.git
Another thing that you may want to do, is create a separate user (i.e. git
) who has the repos it their home directory. In this case, you would use:
$ git clone git@address-of-your-server:my-repo.git
Take them public
If you would want to make the repos public, you can sym-link the my-repo.git
directory to the html root of your HTTP server (usually /var/www/html). If you use docker containers, that would mean mounting the directory as a host volume.
This would make the repo accessible as:
$ git clone http://address-of-your-server/my-repo.git
Unfortunatley, there would be no browser-friendly page to see there. For that you would have to turn to gitweb (only basic interface) or Gitea (an opensource clone of GitHub).
Git used as intended
When I figured this out, I was amazed how basic and intuitive this feels. No clicking on a web interface, generating a README file, registration and such. Just the thing, you actually want to do: git init
.
And it’s faster too (especially if the server is your basement)!