- En un entorno donde tanto los repositorios personales como los de trabajo están en
~/workspace, es más preciso dividir la identidad de Git según la URL remota que según la ubicación de la carpeta - El
includeIfde Git puede cargar configuraciones por ruta congitdir, pero si se mezclan repositorios de varias cuentas dentro del mismo directorio de trabajo, la ramificación basada en rutas llega a su límite - Si usas la condición
hasconfig:remote.*.url:, puedes incluir archivos de configuración separados según patrones de URL remota, como GitHub, GitLab, SourceHut o una organización específica de GitHub - Las claves SSH deben administrarse por separado en
~/.ssh/configconHost,Hostname,UsereIdentityFile, y si quieres usar claves distintas por organización incluso en el mismogithub.com, necesitas un alias de Host - Si configuras también
url.<base>.insteadOf, puedes seguir usandogit@github.com:orgname/projectcomo siempre, pero internamente se reemplazará porgh-work:orgname, haciendo que se aplique la configuración SSH correcta
Separar la configuración de Git según la URL remota
- Los ejemplos tradicionales de
includeIfincluyen distintos archivos de configuración según la ruta del directorio local, por ejemplogitdir:~/code/**ogitdir:~/work/**- Debajo de
~/codepuedes cargar~/.config/git/personal, y debajo de~/work,~/.config/git/work - Los archivos incluidos normalmente contienen la identidad de Git y la clave de firma, como
user.name,user.emailyuser.signingkey
- Debajo de
- Si todo tu código está en
~/workspace, los repositorios personales,work-1ywork-2pueden quedar mezclados en la misma estructura de rutas, así que resulta difícil separarlos como quieres usando solo condiciones basadas en ruta - Si usas
hasconfig:remote.*.url:de Git, puedes incluir un archivo de configuración solo cuando el repositorio actual tenga una URL remota específica- Si coincide con
git@github.com:*/**, usa~/.config/git/config-gh - Si coincide con
git@github.com:orgname/**, usa~/.config/git/config-gh-org - Si coincide con
git@gitlab.com:*/**, usa~/.config/git/config-gl - Si coincide con
git@git.sr.ht:*/**, usa~/.config/git/config-srht
- Si coincide con
- Git incluye la última configuración que haga match, así que el orden de las condiciones es importante
- La condición
github.com:orgname/**debe ir debajo de la condición generalgithub.com:*/**para que la configuración exclusiva de la organización no quede sobrescrita por la configuración general de GitHub
- La condición
- Como resultado, los repositorios que tengan un remote
github.com:orgname/**usaránconfig-gh-org, y los demás repositorios de GitHub usarán la configuración general de GitHub
Ajustar la información de conexión por organización con claves SSH e insteadOf
- Además de la identidad de Git, necesitas configurar claves SSH para poder hacer
pullypushal remote- En
~/.ssh/config, puedes asignar~/.ssh/gitlab.id_ed25519agitlab.com - Y
~/.ssh/github.id_ed25519agithub.commedianteIdentityFile
- En
- Dependiendo de cómo tengas configurado
ssh-agent, puede ser recomendable agregarIdentitiesOnly yesdebajo deIdentityFileen cadaHost - Si quieres usar claves distintas por organización en el mismo
Hostname,github.com, necesitas darle valores distintos aHost- La configuración tendría la forma
Host gh-work,Hostname github.com,User git,IdentityFile ~/.ssh/work.id_ed25519
- La configuración tendría la forma
- Si en la configuración de Git usas
url "gh-work:orgname"junto coninsteadOf = git@github.com:orgname, Git puede reemplazar la URL automáticamente- El usuario escribe algo como
git clone git@github.com:orgname/project - Git reemplaza la parte
github.com:orgnameporgh-work:orgnamey usa la configuracióngh-workde~/.ssh/config
- El usuario escribe algo como
- Este método es un truco tomado de SSH and multiple Git credentials, y también se consultaron los siguientes artículos
1 comentarios
Opiniones en Hacker News
En vez de usar
insteadOf, clonar el repositorio comogh-work:org/repoy poner en la configuración de GitincludeIf "hasconfig:remote.*.url:gh-work:**/**"Así, los repositorios clonados con la identidad SSH definida bajo
gh-worktoman automáticamente la configuración degh-work.inc, que contiene la identidad de Git y la clave de firma, como la configuración SSHAl final, el nombre
gh-workse vuelve el criterio para distinguir la identidad SSH y la identidad de Git, lo que lo hace más fácil de entenderincludeIfdistingue mayúsculas y minúsculas, y en la prioridad gana la última configuraciónPara comprobar si funciona correctamente, basta con ejecutar
git remote get-url originygit config --get user.emailCreo que una mejor forma es poner alias por identidad en
.gitconfigdentro deHOMEy, justo después de inicializar o clonar un repositorio, ejecutargit config-companyogit config-personalActivas
user.useConfigOnly = truey, en los alias, configurasuser.email,user.nameycore.sshCommanddel repositorio local con las claves SSH personales/de la empresa, respectivamenteLa ventaja del enfoque del artículo parece ser que, si clonas desde la organización, simplemente funciona
Antes, en una startup había una persona que cambiaba su identidad todos los días por algún nombre de cuento de hadas
Los commits del lunes eran de Mr. Bunnymann, los del martes de Doctor Funtime, y así, por lo que era muy molesto al hacer forense de control de versiones
Si se mira con generosidad, quizá intentaba recordarnos que cualquiera puede poner cualquier valor en la configuración de identidad, así que no deberíamos confiar demasiado en ese dato
Aun así, saber quién lo hizo ayuda para preguntar detalles o anticipar estilo y experiencia
Si se exigen firmas GPG en los commits y se registran las identidades GPG permitidas, se puede identificar al autor real por la firma en vez de por los metadatos de autor/committer
Claro que “simple” y las firmas GPG no siempre van de la mano
Si no puedes confiar en que un empleado identifique correctamente sus propios commits, creo que deberías despedirlo
Sin tocar
~/.ssh/config, basta con ponercore.sshCommand = /usr/bin/ssh -o IdentitiesOnly=yes -i ~/.ssh/IdentityFile2 -aen~/.gitconfigo, como en el artículo, en~/.config/git/personalAsí los submódulos se vuelven más fáciles incluso sin
insteadOfDesde hace tiempo uso
includeIfbasado en directorios (https://www.bobek.cz/til/git-identities/), perohasconfig:remotees realmente impecableTambién funciona al clonar repositorios
includeIfes bastante buenoPor ahora dejo la complejidad de SSH en
~/.sshy tengo un include para cada cliente/proyecto/identidadPara cosas como GitHub, que no tienen un hostname único, pongo un alias de host como
customer-githuby lo configuro conHostName github.com,IdentityFile ~/.ssh/customer_rsa,User gitDespués, en
git clone, solo uso ese alias y listoTuve el mismo problema y ahora, por así decirlo, ya hay una solución
Si usas NixOS y home-manager en Linux y Mac, esta configuración se vuelve sencilla
En
programs.git.includes, poncondition = "hasconfig:remote.*.url:git@github.com:/**"junto con la configuración deuser.emailReferencia: https://nix-community.github.io/home-manager/options.xhtml#opt-programs.git.includes
.gitconfigEs la misma condición y configuración que en el artículo, pero además agrega una etapa de build/plantilla y aprender un nuevo lenguaje de programación con una sintaxis peculiar
Ya estaba separando la configuración de trabajo y personal con
includeIf: "gitdir", perohasconfig:remotecambia totalmente las reglas del juegoA los consultores siempre les recomiendo firmemente usar una máquina separada para el trabajo o, como mínimo, un usuario de SO separado
Si usas una máquina personal para trabajar, corres el riesgo de meterte en grandes problemas
Puede ser una empresa remote-first donde tú consigues la laptop y cada 2 o 3 años recibes dinero para comprar una nueva, pero sigue siendo tu laptop personal; o puede tratarse de un contratista temporal
Habría que explicar con más detalle en qué situaciones y por qué se vuelve un problema
Los riesgos son reales, pero si no puedes enumerarlos, se parece más a difundir FUD que a educar
Es una herramienta que hice para cambiar fácilmente la identidad de Git por proyecto: https://github.com/cquintana92/git-switch-user
Después de configurar las identidades, ejecutas
$ git su Personalo$ git su Work, y se configuran en.git/configdel repositorio el correo, el nombre, la clave SSH y, opcionalmente, también la clave PGPMe ahorró mucho tiempo
Es una herramienta de 12 años, pero sigue con mantenimiento activo