Archive for July, 2018

Building a Bare-Bones Git Environment

How to migrate repositories from GitHub, configure the software and get
started with hosting Git repositories on your own Linux server.

With the recent news of Microsoft’s acquisition of GitHub, many people have
to research other code-hosting options. Self-hosted solutions like GitLabs
offer a polished UI, similar in functionality to GitHub but one that requires
reasonably well-powered hardware and provides many features that casual
Git users won’t necessarily find useful.

For those who want a simpler solution, it’s
possible to host Git repositories locally on a Linux server using a few basic
pieces of software that require minimal system resources and provide basic
Git functionality including web accessibility and HTTP/SSH cloning.

In this
article, I show how to migrate repositories from GitHub, configure the
necessary software and perform some basic operations.

Migrating Repositories

The first step in migrating away from GitHub is to relocate your repositories
to the server where they’ll be hosted. Since Git is a distributed version
control system, a cloned copy of a repository contains all information
necessary for running the entire repository. As such, the repositories can
be cloned from GitHub to your server, and all the repository data, including
commit logs, will be retained. If you have a large number of repositories
this could be a time-consuming process. To ease this process, here’s a bash
function to return the URLs for all repositories hosted by a specific GitHub

genrepos() {
    if [ -z "$1" ]; then
        echo "usage: genrepos "
        while [ -n "$repourl" ]; do
            curl -s "$repourl" | awk '/href.*codeRepository/
 ↪{print gensub(/^.*href="\/(.*)\/(.*)".*$/,
↪"https://github.com/\\1/\\2.git","g",$0); }'
            export repourl=$(curl -s "$repourl" | grep'>PreviousNextNext' | sed

This function accepts a single argument of the GitHub user name. If the
output of this command is piped into a while loop to read each
line, each line
can be fed into a git clone statement. The repositories will be
cloned into the /opt/repos directory: