- Dans un environnement où les dépôts personnels et professionnels sont tous placés dans
~/workspace, il est plus précis de séparer les identités Git en se basant sur l’URL du remote plutôt que sur l’emplacement du dossier - Le
includeIfde Git peut charger des configurations par chemin viagitdir, mais si des dépôts de plusieurs comptes sont mélangés dans un même répertoire de travail, la séparation par chemin atteint vite ses limites - En utilisant la condition
hasconfig:remote.*.url:, on peut inclure des fichiers de configuration distincts selon des motifs d’URL de remote, comme GitHub, GitLab, SourceHut ou une organisation GitHub spécifique - Les clés SSH doivent être gérées séparément dans
~/.ssh/configavecHost,Hostname,UseretIdentityFile, et pour utiliser des clés différentes selon l’organisation sur un mêmegithub.com, il faut des alias de Host - En configurant aussi
url.<base>.insteadOf, on peut continuer à utilisergit@github.com:orgname/projectau quotidien, tout en le remplaçant en interne pargh-work:orgnameafin d’appliquer la bonne configuration SSH
Séparer la configuration Git selon l’URL du remote
- Les exemples classiques de
includeIfincluent différents fichiers de configuration selon le chemin du répertoire local, commegitdir:~/code/**ougitdir:~/work/**- Sous
~/code, on peut charger~/.config/git/personal, et sous~/work,~/.config/git/work - Les fichiers inclus contiennent généralement l’identité Git et la clé de signature, comme
user.name,user.emailetuser.signingkey
- Sous
- Si tout le code est placé sous
~/workspace, des dépôts personnels,work-1etwork-2peuvent se retrouver mélangés dans la même arborescence, ce qui rend la séparation souhaitée difficile à obtenir avec les seules conditions basées sur le chemin - Avec
hasconfig:remote.*.url:de Git, on peut inclure un fichier de configuration uniquement si le dépôt courant possède une URL de remote donnée- si cela correspond à
git@github.com:*/**, charger~/.config/git/config-gh - si cela correspond à
git@github.com:orgname/**, charger~/.config/git/config-gh-org - si cela correspond à
git@gitlab.com:*/**, charger~/.config/git/config-gl - si cela correspond à
git@git.sr.ht:*/**, charger~/.config/git/config-srht
- si cela correspond à
- Git inclut la dernière configuration qui correspond, donc l’ordre des conditions est important
- la condition
github.com:orgname/**doit être placée sous la condition généralegithub.com:*/**afin que la configuration dédiée à l’organisation ne soit pas écrasée par la configuration GitHub générique
- la condition
- En pratique, un dépôt avec un remote
github.com:orgname/**utiliseraconfig-gh-org, tandis que les autres dépôts GitHub utiliseront la configuration GitHub générale
Faire correspondre les informations de connexion par organisation avec les clés SSH et insteadOf
- Indépendamment de l’identité Git, il faut aussi une configuration de clé SSH pour
pulletpushvers un remote- dans
~/.ssh/config, on peut par exemple attribuer~/.ssh/gitlab.id_ed25519àgitlab.com - et définir
IdentityFilesur~/.ssh/github.id_ed25519pourgithub.com
- dans
- Selon la configuration de
ssh-agent, il peut être utile d’ajouterIdentitiesOnly yessousIdentityFilepour chaqueHost - Pour utiliser des clés différentes selon l’organisation sur un même
Hostnamecommegithub.com, il faut donner une valeur différente àHost- la configuration prend alors la forme
Host gh-work,Hostname github.com,User git,IdentityFile ~/.ssh/work.id_ed25519
- la configuration prend alors la forme
- Avec
url "gh-work:orgname"etinsteadOf = git@github.com:orgnamedans la configuration Git, l’URL Git peut être remplacée automatiquement- l’utilisateur saisit
git clone git@github.com:orgname/project - Git remplace alors la partie
github.com:orgnamepargh-work:orgnameet utilise la configurationgh-workde~/.ssh/config
- l’utilisateur saisit
- Cette approche s’appuie sur une astuce présentée dans SSH and multiple Git credentials, et les autres références consultées sont les suivantes
1 commentaires
Commentaires sur Hacker News
Au lieu de
insteadOf, cloner le dépôt engh-work:org/repoet mettre dans la configuration GitincludeIf "hasconfig:remote.*.url:gh-work:**/**"Ainsi, les dépôts clonés avec l’identité SSH définie sous
gh-workrécupèrent automatiquement la configurationgh-work.inc, qui contient l’identité Git ainsi que la clé de signature et la configuration SSHAu final, le nom
gh-worksert de critère pour distinguer l’identité SSH de l’identité Git, ce qui est plus facile à comprendreincludeIfest sensible à la casse, et, pour les priorités, la dernière configuration l’emportePour vérifier que cela fonctionne correctement, il suffit d’exécuter
git remote get-url originetgit config --get user.emailÀ mon avis, une meilleure méthode consiste à définir dans le
.gitconfigdeHOMEdes alias par identité, puis à exécutergit config-companyougit config-personaljuste après l’initialisation ou le clonage du dépôtIl suffit d’activer
user.useConfigOnly = trueet, dans les alias, de configureruser.email,user.nameetcore.sshCommanddu dépôt local avec la clé SSH personnelle ou professionnelle correspondanteL’avantage de la méthode de l’article semble être que, si l’on clone depuis l’organisation, cela fonctionne tout simplement
Dans une startup où j’ai travaillé autrefois, quelqu’un changeait chaque jour son identité pour un nom fantaisiste tiré d’un conte
Les commits du lundi étaient signés Mr. Bunnymann, ceux du mardi Doctor Funtime, etc., ce qui rendait les analyses forensiques de versioning très pénibles
En étant charitable, il cherchait peut-être à rappeler que n’importe qui peut mettre n’importe quelle valeur dans sa configuration d’identité, et qu’il ne faut donc pas trop s’y fier
Cela dit, savoir qui l’a fait aide tout de même si l’on veut poser des questions sur les détails ou anticiper le style et l’expertise de la personne
En exigeant des signatures GPG sur les commits et en enregistrant les identités GPG autorisées, on peut identifier l’auteur réel par la signature plutôt que par les métadonnées auteur/committer
Bien sûr, « simplement » et les signatures GPG ne vont pas toujours très bien ensemble
Si l’on ne peut pas faire confiance à un employé pour identifier correctement ses propres commits, à mon avis il faut le licencier
Sans avoir à toucher à
~/.ssh/config, on peut mettrecore.sshCommand = /usr/bin/ssh -o IdentitiesOnly=yes -i ~/.ssh/IdentityFile2 -adans~/.gitconfigou, comme dans l’article, dans~/.config/git/personalCela simplifie les sous-modules même sans
insteadOfJ’utilisais depuis longtemps
includeIfbasé sur les répertoires (https://www.bobek.cz/til/git-identities/), maishasconfig:remoteest vraiment propreCela fonctionne aussi lors du clonage d’un dépôt
includeIfest plutôt très bienPour l’instant, je laisse la complexité SSH dans
~/.sshet j’ai un include par client/projet/identitéPour ceux qui n’ont pas de nom d’hôte unique, comme GitHub, j’ajoute un alias d’hôte du type
customer-github, avec une configuration commeHostName github.com,IdentityFile ~/.ssh/customer_rsa,User gitEnsuite, il suffit d’utiliser cet alias dans
git cloneJ’avais le même problème, et voilà maintenant une solution
Avec NixOS et home-manager sur Linux et Mac, cette configuration devient simple
Il suffit de mettre dans
programs.git.includescondition = "hasconfig:remote.*.url:git@github.com:/**"et la configurationuser.emailRéférence : https://nix-community.github.io/home-manager/options.xhtml#opt-programs.git.includes
.gitconfigC’est la même condition et la même configuration que dans l’article, mais on y ajoute une étape de build/templating et l’apprentissage d’un nouveau langage de programmation à la syntaxe particulière
Je séparais déjà mes configurations pro et perso avec
includeIf: "gitdir", maishasconfig:remotechange complètement la donneAux consultants, je recommande toujours fortement d’utiliser une machine séparée pour le travail, ou au minimum un utilisateur d’OS séparé
Utiliser une machine personnelle pour le travail expose à de sérieux ennuis
Dans une entreprise remote-first, on peut devoir fournir soi-même son ordinateur portable et recevoir tous les 2 ou 3 ans un budget pour en acheter un nouveau, tout en restant sur son portable personnel ; on peut aussi être contractuel temporaire
Il faut préciser plus concrètement dans quelles situations cela pose problème et pourquoi
Les risques sont réels, mais si on ne les énumère pas, cela ressemble davantage à de la FUD qu’à de la pédagogie
Voici un outil que j’ai créé pour changer facilement d’identité Git selon le projet : https://github.com/cquintana92/git-switch-user
Après avoir défini les identités, exécuter
$ git su Personalou$ git su Workconfigure l’e-mail, le nom, la clé SSH et, éventuellement, la clé PGP dans le.git/configdu dépôtCela m’a fait gagner beaucoup de temps
C’est un outil vieux de 12 ans, mais il est encore activement maintenu