Wednesday, August 13, 2025

Administra correctamente tus cuentas Github personal y de trabajo


Es muy comun que como desarrollador software tengas proyectos en tu maquina donde tienes repositorios tanto con cuenta del trabajo como con cuenta personal. Propablemente ya te has topado con problemas como "Permisson denied (publickey)" cuanto tratas de hacer "push" de alguno de esos repositorios. Que puede estar pasando? seguramente alguna confusion en cuanto a las llaves SSH que usar.

Este problema lo tuve durante mucho tiempo con la maquina del trabajo, y mi forma de solucionarlo era constantemente reiniciar el agente ssh (ssh-agent) y cargar la llave publica SSH correcta con la que iba a trabajar en esa sesion en la terminal. Incluso, debido a esto, llegaba a hacer commit a repositorios del trabajo con mi cuenta personal, algo que no se debe de hacer.

Definitivamente esto no es lo mejor, y despues de investigar un rato, encontre una mejor solucion.

Alias para Host SSH

El primer paso es tener bien configurado el archivo ~/.ssh/config de la siguiente manera

-----------------------------------------------------------------------------
# Cuenta personal github
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/llavePublicaPersonalSsh
    AddKeysToAgent yes
    UserKeychain yes

# Cuenta github del trabajo
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/llavePublicaTrabajoSsh
    AddKeysToAgent yes
    UserKeychain yes
------------------------------------------------------------------------------

Esto crea 2 alias, uno para la cuenta personal y otra para del trabajo, y que estaran usando diferentes llaves publicas SSH, aunque como puedan notar, ambas esten apuntando al HostName github.com.

Configura .gitconfig

Podemos configurar git para que automaticamente use diferentes configuraciones basado en el directorio en que nos encontremos de la siguiente forma en el archivo ~/.gitconfig 

-----------------------------------------------------------------------------
[user]
    name = Tu nombre
    email = personal@email.com


[includeif "gitdir:~/Projects/Personal/"]
    path = ~/.gitconfig-personal

[includeif "gitdir:~/Projects/Work/"]
    path = ~/.gitconfig-work
-----------------------------------------------------------------------------

Despues el archivo ~/.gitconfig-personal

-----------------------------------------------------------------------------
[user]
    name = Tu nombre
    email = personal@email.com
[core]
    sshCommand = ssh -i ~/.ssh/llavePublicaPersonalSsh
-----------------------------------------------------------------------------

y por ultimo el archivo ~/.gitconfig-work

-----------------------------------------------------------------------------
[user]
    name = Tu nombre
    email = work@email.com
[core]
    sshCommand = ssh -i 
~/.ssh/llavePublicaTrabajoSsh
-----------------------------------------------------------------------------

que estamos logrando con esto? ah pues es muy facil de probar.

Si llegamos a crear proyectos git debajo del folder ~/Projects/Personal por default, la configuracion de user.name y user.email sera la definida en el archivo ~/.gitconfig-personal. Esto lo podemos verificar muy facilmente si seguimos los siguientes pasos:

  1. Crea un folder dentro de ~/Projects/Personal, digamos ~/Projects/Personal/ejemplo
  2. Dentro del folder inicia un repositorio de git con git init
  3. Verifica que el comando: git config user.name muestra tu nombre
  4. Verifica que el comando: git config user.email muestra tu correo personal
De manera similar con nuevos repositorios git dentro del folder ~/Projects/Work deberan mostrar tu nombre y correo del trabajo.

Cabe mencionar que esto aplicara a nuevos repositorios git que crees inicializandolos con git init. Para repositorios existentes o repositorios que tengas que clonar hay que hacer lo siguiente que menciono en este articulo.

Clona repositorios con el Host correcto

Para indicar a git que configuracion usar para el repositorio que estamos a punto de clonar debemos de indicarle el Host correcto en el comando "clone":

-----------------------------------------------------------------------------

cd 
~/Projects/Work/Repositories

git clone git@github-work:company/some-interesting-project.git

-----------------------------------------------------------------------------

Notaran en rojo que el host especificado no es github.com, si no github-work, que es el alias que especificamos antes en el archivo ~/.ssh/config . Esto le dice a git que alias usar, por consiguiente que llave SSH usar tambien y al estar debajo del folder ~/Projects/Work usara la correcta configuracion de user.name y user.email para repositorios del trabajo.

Actualiza repositorios exsitentes

Todos los pasos anteriores no funcionaran para repositorios que ya tengamos clonados en los correspondientes folders. Entonces, para lograr lo mismo que ya hablamos anteriormente, tendremos que actualizar las remote URL de cada uno de estos repositorios. Afortunadamente no es un paso dificil, basicamente, tenemos que obtener las remote URL y reasignarlas usando el Host alias correcto.

-----------------------------------------------------------------------------

# Entra al folder
cd ~/Projects/Work/Repositories/interesting-project-already-cloned

# Ve que remote URLs hay
git remote -v

# Actualiza
git remote set-url origin git@github-work:company/interesting-project.git

# Verifica que las remote URL de origin cambiaron
git remote -v

-----------------------------------------------------------------------------

Asegurate de correr el agente SSH y cargar las llaves

Tal vez el ultimo paso sea asegurarnos de que cada que entremos a una sesion en la termina el agente SSH este corriendo y tenga las llaves correctas cargadas agregando la siguientes instrucciones a tu archivo ~/.zshrc~/.bashrc segun sea tu caso:

-----------------------------------------------------------------------------

# Inicia el agente SSH
eval "$(ssh-agent -s)" > /dev/null

# Agrega la llave privada personal
ssh-add ~/.ssh/llavePublicaPersonalSsh /dev/null

# Agrega la llave privada del trabajo
ssh-add ~/.ssh/
llavePublicaTrabajoSsh /dev/null

-----------------------------------------------------------------------------

y listo! con esto deberia quedar.

No comments: