Git Mirroring to GitLab
Steps for setting up automatic mirroring cron jobs:
Add a new user:
sudo adduser --disabled-login --system git-mirroring
Start a shell as the
git-mirroring
user:sudo -H -u git-mirroring /bin/bash
Switch to the home directory:
cd
Create an executable file
sync.sh
(replacenano
with the editor of your choice):touch sync.sh chmod +x sync.sh nano sync.sh
Type in the following contents:
#!/bin/sh for repo in ~/*.git; do cd "$repo" && git fetch -q && git push -q gitlab || echo "sync failed for $repo" done
Save and exit the editor.
Create a ssh key:
ssh-keygen
Press enter for all prompts -- leaving the file names as default and with an empty password.
For each repo to be mirrored:
In the following commands, replace
$UPSTREAM_URL
with the url for the upstream repo,$NAME
with the name selected for the local directory.Create an empty repo using the GitLab website.
Warning
Following these steps will overwrite anything that is in the GitLab repo.
In the following commands, replace
$MIRROR_URL
with the ssh url for the mirror, you can get it by clicking the Clone button for the empty repo you just created.Add the ssh key for the
git-mirroring
user to the GitLab repo as a deploy key with read/write access:Get the ssh public key for the
git-mirroring
user:cat ~/.ssh/id_rsa.pub
Clone the upstream repo:
git clone --mirror "$UPSTREAM_URL" ~/"$NAME".git
Switch to the directory where you just cloned the repo:
cd ~/"$NAME".git
Add the mirror as a new remote to allow pushing to it:
git remote add --mirror=push gitlab "$MIRROR_URL"
Try pushing to the new remote to ensure everything is operating correctly:
git push gitlab
Switch back to the home directory:
cd
Ensure
sync.sh
works properly:./sync.sh
Set up the cron job for running
sync.sh
:Edit the user's
crontab
:crontab -u git-mirroring -e
Add the following line to the end, then save and exit:
* * * * * exec ~/sync.sh >> ~/sync.log 2>&1
Wait for the cron job to run (2 minutes should be sufficient), then check the log file:
less ~/sync.log
The log file should exist and be empty, if it isn't empty, it contains error messages. If it doesn't exist, the cron job didn't run yet for some reason, try waiting a little longer.
Try pushing a commit to one of the upstream repos and seeing if it gets properly synced to the corresponding mirror repo. The sync job runs every minute, so wait 2 minutes and check.