Git is by far the most used version control system out there. Originally created by Linus Torvalds, it is free and open source software, released under the GPLv2 license. Many online platforms such as Github or Gitlab allow developers to easily store and track changes in their code in public or private repositories using git as a backend.
In this article we talk about gickup, a nice tool written in Go which lets us create backups of our git repositories and mirror them locally, or from one platform to another.
In this tutorial you will learn:
- How to install gickup
- How to backup your repositories locally
- How to mirror Github repositories to Gitlab

Category | Requirements, Conventions or Software Version Used |
---|---|
System | Distribution agnostic |
Software | gickup |
Other | Root privileges may be needed to run the Docker container |
Conventions | # – requires given linux-commands to be executed with root privileges either directly as a root user or by use of sudo command$ – requires given linux-commands to be executed as a regular non-privileged user |
Installation
Gickup is open source software: its code is hosted itself on Github. At the moment of writing, the tool is not available in any Linux distribution repository yet, therefore, if we don’t want to compile it, there are basically two ways we can use it:
- by downloading the pre-compiled binary from Github
- by using the dedicated Docker Image
Let’s explore these options.
Using the pre-compiled binary
At the moment of writing 0.10.17
is the latest available version of gickup; we can download the pre-compiled binary from the releases page of the project on Github. Pre-compiled binaries exist for all the major operating systems and for the most common architectures. We want to download the Linux version, of course, together with the *checksum.txt
file, in order to verify the integrity of the data. To run gickup on my machine, I need to download the “amd64” version:
$ curl --location --remote-name-all https://github.com/cooperspencer/gickup/releases/download/v0.10.17/{gickup_0.10.17_linux_amd64.tar.gz,gickup_0.10.17_checksums.txt}
In order to verify the tarball checksum, assuming the two files to be in the same directory (as it would result from running the above command), we can run:
$ sha256sum -c gickup_0.10.17_checksums.txt
If the checksum of the tarball corresponds to the one written in the file, we should see a message similar to the one below:
gickup_0.10.17_linux_amd64.tar.gz: OK
To extract the tarball we run:
$ tar -xvzf gickup_0.10.17_linux_amd64.tar.gz
In order to use the application we just need to launch the extracted binary file just as any other executable, passing the path of the configuration file (more on this in a moment) as first argument:
$ ./gickup /path/to/conf.yml
Using the dedicated Docker image
If we don’t want to use the pre-compiled binary, as an alternative, we can download the docker-compose.yml file, and run the tool in a container, by using docker or podman. We can download the file straight from the command line:
$ curl --remote-name https://raw.githubusercontent.com/cooperspencer/gickup/main/docker-compose.yml
The next step consists into placing the configuration file, which in this case must be named conf.yml
, in the same directory of the file we just downloaded. In order to launch the backup, we just need to run:
$ sudo docker-compose up
Or, if using podman instead of docker:
$ podman-compose up
If you are using docker and your user is in the “docker” group, you can omit using sudo; podman, instead, can run without root privileges.
Those are the instruction we can use to run gickup. We can specify what the tool should do, and how it should do it, via the configuration file we mentioned above. Let’s see an example of its usage.
The gickup configuration file
Gickup makes use of a YAML configuration file in which we define the sources and destinations of our backups, plus other useful actions. Let’s some examples. For the sake of this tutorial I will download all my repositories from Github to my local machine:
source:
github:
- token: <github-token>
username: egdoc
destination:
local:
- path: ~/Downloads/gitbackup
structured: true
zip: true
keep: 5
bare: true
In the example above I specified I want to backup my Github repositories using the github
key in the source
dictionary. Since I want to backup both public and private repos, I had to provide a token as argument of the token
key. Generating a Github token is pretty easy: it’s enough to navigate to “Settings -> Developer settings -> Personal access tokens” in your Github profile, select either a fine-grained or a personal token, and grant it the minimum required set of privileges. In this case it should be enough to just check the “repo” box, as in shown the picture below:

Once the token is generated, keep note of it, since you will not be able to visualize it in the future.
The next key I used in the configuration file is username
, to specify the user for the clone process. With the destination
dictionary, instead, I specified the backups destination. In this case, since I wanted the repositories to be cloned locally, I used the path
key to specify a local path, and the structured
key to make gickup clone the repositories in a directory tree which reflects the source website and username. In this case the repositories hosted on Github will be cloned in the ~/Downloads/gitbackup/github.com/egdoc
directory.
The
zip
key is used to specify we want each cloned repository to be zipped; keep
, instead, is used to specify how many “zipped” backups which should be kept. Finally, by setting the value of the bare
key to true
, I specified I want the repositories to be cloned as “bare”.
Mirror repositories from one platform to another
In the previous example I cloned all my repositories hosted on Github on my local machine. By using gickup, however, we can also clone repositories directly from one platform to another. Suppose I want to mirror all the repositories to Gitlab. Here is what I could write:
source:
github:
- token: <github-token>
username: egdoc
destination:
gitlab:
- token: <gitlab-token>
username: egdoc
In all the examples you can see I specified only the platform name (e.g. “github” or “gitlab”) and not the complete platform URL. This is possible because gickup has built-in support for those platforms. Platforms supported as source are:
- Github
- Gitea
- Gogs
- Gitlab
- Bitbucket
- Onedev
- Sourcehut
Additionally, the “Any” key can be used to specify information about platforms not included in the list above.
Platforms supported as destination, instead are:
- Gitea
- Gogs
- Gitlab
- Local
Conclusions
In this tutorial we talked about gickup, a nice open source tool written in Go we can use to mirror our git repositories locally, or from one web platform to another. We provided two little examples of how to achieve both results; to know more about the project, you can take a look at the official documentation.