1 =======================
2 Git Mirroring to GitLab
3 =======================
5 Steps for setting up automatic mirroring cron jobs:
11 sudo adduser --disabled-login --system git-mirroring
13 #) Start a shell as the :code:`git-mirroring` user:
17 sudo -H -u git-mirroring /bin/bash
19 #) Switch to the home directory:
25 #) Create an executable file :code:`sync.sh` (replace :code:`nano` with the editor of your choice):
33 a) Type in the following contents:
38 for repo in ~/*.git; do
39 cd "$repo" && git fetch -q && git push -q gitlab || echo "sync failed for $repo"
42 #) Save and exit the editor.
50 Press enter for all prompts -- leaving the file names as default and with an empty password.
52 #) For each repo to be mirrored:
54 In the following commands, replace :code:`$UPSTREAM_URL` with the url for the upstream repo, :code:`$NAME` with the name selected for the local directory.
56 a) Create an empty repo using the GitLab website.
60 Following these steps will overwrite anything that is in the GitLab repo.
62 In the following commands, replace :code:`$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.
64 b) Add the ssh key for the :code:`git-mirroring` user to the GitLab repo as a `deploy key with read/write access <https://docs.gitlab.com/ce/ssh/#per-repository-deploy-keys>`_:
66 Get the ssh public key for the :code:`git-mirroring` user:
72 #) Clone the upstream repo:
76 git clone --mirror "$UPSTREAM_URL" ~/"$NAME".git
78 #) Switch to the directory where you just cloned the repo:
84 #) Add the mirror as a new remote to allow pushing to it:
88 git remote add --mirror=push gitlab "$MIRROR_URL"
90 #) Try pushing to the new remote to ensure everything is operating correctly:
96 #) Switch back to the home directory:
102 #) Ensure :code:`sync.sh` works properly:
108 #) Set up the cron job for running :code:`sync.sh`:
110 a) Edit the user's :code:`crontab`:
114 crontab -u git-mirroring -e
116 #) Add the following line to the end, then save and exit:
120 * * * * * exec ~/sync.sh >> ~/sync.log 2>&1
122 #) Wait for the cron job to run (2 minutes should be sufficient), then check the log file:
128 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.
130 #) 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.