Contenu

Multi configuration Git

Intro

Une des premières choses que l’on fait quand on configure son poste pour utiliser Git, c’est de renseigner notre nom d’utilisateur et un email qui sera utilisé pour tous les commits fait sur notre machine. Pour cela, soit on édite à la main le fichier ~/.gitconfig soit on lance les deux commandes suivantes :

1
2
git config --global user.name "François Dubrez"
git config --global user.email francois.dubrez@whatever.com

Un commit avec cette configuration donne quelque chose du style :

1
2
3
4
5
commit f42de4571dc587043124c00a48ab50b0f32434a4 (HEAD -> master)
Author: François Dubrez <francois.dubrez@whatever.com>
Date:   Fri Oct 2 10:52:08 2020 +0200

    1st commit

Cela fonctionne très bien si l’on utilise qu’une seule plateforme pour publier notre code source. Mais qu’en est-il si l’on doit gérer plusieurs plateformes? J’utilise Gitlab chez Max, un Gitlab “on premise” chez mon client et Github pour des projets perso.

Comment modifier mon adresse mail selon le contexte dans lequel je travaille?

  1. Je peux utiliser des utilisateurs différents qui auront leur propre configuration dans le fichier ~/.gitconfig.
  2. Je pourrais ajouter un alias me permettant de modifier le mail rapidement via la commande git config --global user.email <email>.
  3. Ne rien avoir à faire grâce aux conditional includes.

C’est cette dernière solution que l’on va détailler dans cet article.

Les conditional includes

A partir de la version 2.13 de Git, il est possible de charger une configuration différente en fonction de l’arborescence de fichier dans laquelle se trouve notre dépôt.

Pour cet exemple je vais configurer 3 adresses différentes:

  • une adresse pour chez le client francois.dubrez@somecompany.com
  • une adresse pour notre propre entreprise soicnarf.zerbud@maxds.fr
  • une adresse perso pour nos contributions sur Github par exemple francois.dubrez@whatever.com

Comme vu plus haut on a configuré en adresse par défaut notre adresse personnelle: francois.dubrez@whatever.com via la commande git config --global user.email <email>.

On va créer une arborescence pour nos 3 “contextes” Git.

1
2
3
4
git
├── github
├── client
└── maxds

Dans notre fichier ~/.gitconfig, on ajoute la configuration nécessaire:

1
2
3
4
5
6
[includeIf "gitdir:~/git/client/"]
    path = ~/git/.gitconfig-client
[includeIf "gitdir:~/git/maxds/"]
    path = ~/git/.gitconfig-maxds
[includeIf "gitdir:~/git/github/"]
    path = ~/git/.gitconfig-github

On crée ensuite les fichiers de configuration spécifiques:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# ~/git/.gitconfig-client
[user]
    email = francois.dubrez@somecompany.com

# ~/git/.gitconfig-maxds
[user]
    email = soicnarf.zerbud@maxds.fr
    
# ~/git/.gitconfig-github
[user]
    email = francois.dubrez@whatever.com

Et voila, maintenant à partir du moment où l’on se trouve dans un dépôt en aval d’un des dossiers client,maxds ou github. Git utilisera la configuration surchargée avec la bonne adresse pour le commit.

Pour aller plus loin

Le port ssh (22) est bloqué dans mon réseau d’entreprise

Il peut arriver qu’il ne soit pas possible de pouvoir cloner un projet via ssh car le port 22 est bloqué.

Si la plateforme le propose, il est possible de modifier notre configuration SSH pour qu’elle utilise un autre port pour cette plateforme.

Exemple pour attaquer gitlab.com sur le port 443 plutôt que le port 22.

1
2
3
4
5
6
7
# ~/.ssh/config
# sera utilisé pour les dépôts publiés sur gitlab.com
Host gitlab.com
  HostName altssh.gitlab.com
  Port 443
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/id_rsa_gitlab

SSH à travers un proxy

Il est également probable que le réseau de votre entreprise se trouve derrière un proxy qui bloque vos requêtes.
Pour exécuter vos commandes via SSH au travers d’un proxy HTTP, vous pouvez utiliser corkscrew.

1
2
3
4
5
6
7
8
# ~/.ssh/config
# sera utilisé pour les dépôts publiés sur gitlab.com
Host gitlab.com
  HostName altssh.gitlab.com
  Port 443
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/id_rsa_gitlab
  ProxyCommand corkscrew <proxy_host> <proxy_port> %h %p

2 comptes différents sur une même plateforme

Il peut arriver que l’on utilise la version SAAS d’un même service (Gitlab ou Github) pour deux comptes différents. Par exemple celui de notre client et notre compte perso.

Pour que l’on puisse utiliser l’authentification SSH il est nécessaire d’utiliser 2 clés SSH distinctes afin que la plateforme puisse nous authentifier auprès de la bonne organisation. Afin que la conf SSH puisse savoir quelle clé utiliser on utilise des URLs fictives de la plateforme qui servira à les différencier.

Comme plus haut on a toujours une conf git par répertoire

1
2
3
4
5
6
7
# ~/.gitconfig
#config maxds
[includeIf "gitdir:~/git/maxds/"]
  path = ~/git/.gitconfig-maxds
#config perso gitlab
[includeIf "gitdir:~/git/perso-gitlab/"]
  path = ~/git/.gitconfig-perso-gitlab

Ensuite on surcharge l’URL à utiliser par git en fonction du répertoire courant.

1
2
3
4
5
6
7
8
# ~/git/.gitconfig-maxds
#prefer to use git protocol to clone, and push methods
[url "git@maxds.gitlab.com:"]
     insteadOf = "git@gitlab.com:"
     insteadOf = "https://gitlab.com/"
     pushInsteadOf = "gitlab:"
     pushInsteadOf = "git://gitlab.com/"
     pushInsteadOf = "https://gitlab.com/"
1
2
3
4
5
6
7
8
# ~/git/.gitconfig-perso-gitlab
#prefer to use git protocol to clone, and push methods
[url "git@perso.gitlab.com:"]
     insteadOf = "git@gitlab.com:"
     insteadOf = "https://gitlab.com/"
     pushInsteadOf = "gitlab:"
     pushInsteadOf = "git://gitlab.com/"
     pushInsteadOf = "https://gitlab.com/"

Enfin dans notre configuration SSH, on référence la clé publique, associée au compte souhaité, en fonction de l’URL utilisée.
Ainsi, perso.gitlab.com utilisera la clef SSH ~/.ssh/gitlab_perso pour se connecter sur gitlab.com
et maxds.gitlab.com utilisera la clef SSH ~/.ssh/gitlab_maxds pour se connecter sur gitlab.com.
On peut l’assimiler à une réécriture de l’URL host pour utiliser le host valide de gitlab.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# ~/.ssh/config
# Personal account
Host perso.gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/gitlab_perso

# Maxds account
Host maxds.gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/gitlab_maxds

Remerciements

Merci à @Jeremie_Hrl et Audren pour leurs conseils et contributions à cet article.