Bien que cela commence à changer, Github reste aujourd’hui la forge de référence pour l’hébergement de projet autour de Git. Néanmoins, dans une démarche d’autonomie numérique, je ne souhaite pas dépendre uniquement de cette plateforme. Pour réduire cette dépendance, j’ai décidé de dupliquer et “mirrorer” l’ensemble de mes dépôts (publics et privés) sur Codeberg, une forge européenne et associative.
On a l’habitude de voir un remote Git comme étant une simple association avec une URL (un remote = une destination). Un remote Git distingue en réalité deux choses: une URL pour récupérer les données (fetch) et une autre pour envoyer les données (push). Vous pouvez, par exemple, les visualiser avec la commande git remote -v dans n’importe quel dépôt Git:
$ git remote -v
origin https://github.com/jdecool/repo.git (fetch)
origin https://github.com/jdecool/repo.git (push)Et rien n’oblige un remote à ne posséder qu’une seule URL de push, il est possible d’en déclarer plusieurs. C’est ce que je fais pour pouvoir pousser les modifications de mes différents dépôts à la fois sur Github et le miroir Codeberg.
Pour déclarer les URLs de push, il faut utiliser la commande git remote set-url avec les options --add et --push:
$ git remote set-url --add --push origin git@github.com:jdecool/repo.git
$ git remote set-url --add --push origin ssh://git@codeberg.org/jdecool/repo.gitLe résultat sera le suivant:
$ git remote -v
origin https://github.com/jdecool/repo.git (fetch)
origin https://github.com/jdecool/repo.git (push)
origin ssh://git@codeberg.org/jdecool/repo.git (push)Le remote origin continue de récupérer les données depuis Github, mais il dispose désormais de deux destinations de push. Cela se traduit par la configuration ci-dessous dans le fichier .git/config:
[remote "origin"]
url = git@github.com:jdecool/repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
pushurl = git@github.com:jdecool/repo.git
pushurl = ssh://git@codeberg.org/jdecool/repo.gitDésormais, lorsque je pousse mes modifications via git push origin main, Git envoie mes commits à la fois vers Github et Codeberg. Les deux instances de mon dépôt restent synchronisées.
Il faudra faire attention lors de la configuration initiale. Par défaut, Git utilise l’URL de fetch pour l’envoi des données. Mais dès que l’on ajoute un premier pushurl, l’URL de fetch ne sera plus utilisée. Il faut donc bien penser à redéclarer l’URL d’origine en plus de la nouvelle.
Autre point important, cette technique reste un miroir unidirectionnel. La récupération des modifications continue de se faire via une seule URL. Si du code est poussé directement sur Codeberg, les changements ne seront pas récupérés automatiquement. Dans le cas présent, je ne le fais que sur mes dépôts personnels dont je suis le principal contributeur. Dans un contexte d’équipe, la configuration n’existant que localement sur les machines, mieux vaut se tourner vers un miroir Git configuré côté forge.