Quelques fois pour diverses raisons on se retrouve à avoir besoin d'avoir des dépôts de code synchronisé sur plusieurs systèmes (GitHub et GitLab, GitHub et Azure DevOps, GitHub et Gitea, etc.). La solution la plus simple et transparente est d'utiliser des WebHooks.

Ici je vous présente une solution qui utilise uniquement une configuration faite via le CLI de git.

On va partir d'un dépôt déjà cloné dans les 2 solutions.

Solution 1 : double push transparent

Dans cette première solution on va faire du double push par défaut et permettre de push sur une des remotes à la demande.

On commence par vérifier les remotes :

git remote -v

origin <origin_url> (fetch)
origin <origin_url> (push)

On va commencer par ré-ajouter la push remote actuelle pour pouvoir activer le multi-push de git :

git remote set-url --add --push origin <origin_url>

On ajoute ensuite la seconde remote :

git remote set-url --add --push origin <other_remote_url>

On met en place des simples push pour chaque remote aussi en cas de besoin (vous pouvez changer le nom de la remote en changeant repo1 et repo2 dans ces commandes) :

git remote add repo1 <origin_url>
git remote add repo2 <other_remote_url>

Puis on vérifie que tout est bien configuré :

git remote -v

origin <origin_url> (fetch)
origin <origin_url> (push)
origin <other_remote_url> (push)
repo1 <origin_url> (fetch)
repo1 <origin_url> (push)
repo2 <other_remote_url> (fetch)
repo2 <other_remote_url> (push)

À l'usage on va donc pouvoir récupérer les commits des autres via un ̀git pull (attention par contre on ne va pull que depuis <origin_url>), partager sur deux remotes simplement via git push. Au besoin on pourra toujours spécifier la remote pour push/pull sur une remote en particulier git pull repo1 ou git push repo1.

Solution 2 : double push à la demande

Ici on va partir du principe qu'on veut push sur une seconde remote uniquement à la demande. Mais on pourra avoir une commande qui fait le push sur les deux remotes à la fois aussi.

On commence par vérifier les remotes :

git remote -v

origin <origin_url> (fetch)
origin <origin_url> (push)

On va commencer par créer une nouvelle remote pour le double push (vous pouvez changer le nom de la remote en remplaçant "all" dans cette commande) :
̀̀`bash
git remote add all <origin_url>


On va ensuite par ré-ajouter la push remote pour pouvoir activer le multi-push de git :
```bash
git remote set-url --add --push all <origin_url>

On ajoute ensuite la seconde remote :

git remote set-url --add --push all <other_remote_url>

On met en place des simples push pour la seconde remote aussi en cas de besoin :

git remote add repo2 <other_remote_url>

Puis on vérifie que tout est bien configuré :

git remote -v

origin <origin_url> (fetch)
origin <origin_url> (push)
all <origin_url> (fetch)
all <origin_url> (push)
all <other_remote_url> (push)
repo2 <other_remote_url> (fetch)
repo2 <other_remote_url> (push)

À l'usage on va donc pouvoir récupérer les commits des autres via un git pull, partager sur la première remote via git push. On pourra partager sur deux remotes via git push all. Au besoin on pourra toujours spécifier la remote pour push/pull sur la seconde remote git pull repo2 ou git push repo2.

Conclusion

Ce n'est pas une technique parfaite pour au moins trois raisons :

  • on ne peut pas pull depuis deux remotes différentes d'un coup : il faut bien se mettre d'accord en équipe sur comment on va fonctionner pour éviter les désynchronisations entre les deux dépôts
  • il faut que chaque personne qui travail sur le projet fasse les manipulations que j'ai décrite pour configurer son dépôt local pour que ça fonctionne (même si il est possible d'avoir un script dans le dépôt qui fait cette configuration)
  • si on a mis en place des push hook, au moment du double push, le hook est appelé deux fois (si je trouve une solution, j'éditerai cet article)

Mais globalement ça fait gagner un peu de temps.

À noter évidemment qu'il est possible de faire du triple (ou plus) push au besoin en ajoutant plus de push url à la remote origin/all.

Crédit photo : https://pixabay.com/photos/tree-nature-wood-kahl-log-tribe-3097419/