|

Pousser une fois, publier partout: le remote Git multi-cibles

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.git

Le 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.git

Dé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.

Jérémy DECOOL

Jérémy DECOOL

Développeur depuis plus d'une décennie, je partage mes réflexions sur les bonnes pratiques de développement, d'architecture logicielle et d'organisation d'équipe.