Ya aprendimos cómo firmar y verificar tus commits con una llave GPG para agregar una capa de seguridad y validación. Ahora aprenderemos cómo podemos tener más de una cuenta de GitHub / GitLab en la misma computadora.
Cabe mencionar que debemos tener minimamente la versión 2.13 de Git
Hace poco inicié en otra empresa en la cual me dijeron que por razones de seguridad y NDA (Non Disclosure Agreement) debía usar una cuenta de GitHub con el correo que me habían dado al ingresar a la empresa.
En ese momento tuve la duda de cómo puedo tener dos cuentas de Git & GitHub en la misma computadora para poder seguir trabajando en mis proyectos personales sin tener que estar saliendo y entrando de una cuenta a otra.
Al principio pensé en hacer el cambio manualmente cada vez que hiciera algún proyecto personal, pero eso realmente no es escalable y siendo sinceros, somos devs; siempre podemos hacerlo mejor y automatizarlo.
Vamos a partir de 0, para poder que cualquier persona pueda seguir esta guía. Es por eso que lo primero que vamos a realizar será generar nuestras llaves privadas (ssh-keys)
. Lo ideal es crear una por cada cuenta.
El proceso es muy similar en Windows / Linux y Mac OS, por ahora sigue los pasos sin importar tu sistema operativo
Este comando creará un par de llaves, una pública y una privada.
ssh-keygen -t rsa -b 4096 -C "email"
Corremos el siguiente comando para la validación del ssh-agent
eval $(ssh-agent -s)
Acá es cuando el proceso en Mac OS es un poco diferente, ya que lo que haríamos en un caso normal con una sola cuenta sería generar un archivo config, pero en este caso como vamos a agregar más de una eso será un paso que nos vamos a saltar.
Por último agregamos la llave privada al sistema. En esta caso los comandos son ligeramente distintos en Mac
Windows y Linux
ssh-add ~/.ssh/id_rsa_personal
Mac OS
ssh-add -K ~/.ssh/id_rsa_personal
Ahora únicamente debemos copiar el contenido nuestra llave pública, (la que termina en .pub
) y llevarlo a GitHub. Para ello solo debes de hacer el siguiente comando en tu terminal
cat ~/.ssh/id_rsa_personal.pub
Ahora. Vas a GitHub > settings > SSH and GPG keys > New SSH key
Y listo! Ahora este mismo proceso deberás hacerlo por cada cuenta adicional que vayas a agregar, para efectos de este tutorial vamos a suponer que ya generaste tus llaves, la de tu cuenta personal y la de la cuenta de tu trabajo.
Te recomiendo cambiarles el nombre para que las puedas distinguir fácilmente. Por ejemplo así lo hice yo.
id_rsa_personal #llave privada para mi cuenta personal
id_rsa_personal.pub #llave publica para mi cuenta personal
id_rsa_trabajo #llave privada para mi cuenta de trabajo
id_rsa_trabajo.pub #llave publica para mi cuenta de trabajo
Por lo general deberíamos de tener un archivo en nuestro root que sea donde viven las configuraciones de git el cual luce más o menos así
[user]
name = <Your name>
email = <Your email>
signingKey = <Your signingKey>
[init]
defaultBranch = main
...
[other configs]
...
Lo que necesitaremos será remover todo el bloque [user]
y dejar solamente las configuraciones generales.
Para ellos puedes usar el siguiente comando:
nano ~/.gitconfig
Al final deberías de tener el archivo más o menos así:
[init]
defaultBranch = main
...
[other configs]
...
Ahora debes crear un archivo por cada cuenta que quieras agregar, supongamos que quieres agregar tu cuenta de GitHub asociada a tu correo personal y otra cuenta asociada con el correo de tu trabajo
Para crear los archivos podemos ejecutar el siguiente comando
touch ~/.gitconfig.personal ~/.gitconfig.trabajo
Cabe resaltar que el .personal
y .trabajo
no tienen que ser exactamente estos, puedes ponerles el nombre que más te parezca, solo recuerda que deben ser distintos entre ellos
Ahora debemos añadir las configuraciones para cada cuenta; empecemos con el archivo .gitconfig.personal
, acá pondremos el bloque [user]
que retiramos en el paso anterior
nano ~/.gitconfig.personal
Así deberíamos de tener el archivo .gitconfig.personal
[user]
name = <Your name>
email = <Your email>
signingKey = <Your signingKey>
Ahora hacemos lo mismo para la otra cuenta, la del trabajo.
nano ~/.gitconfig.trabajo
Así deberíamos de tener el archivo .gitconfig.trabajo
[user]
name = <Your name>
email = <Your work@email>
signingKey = <Your signingKey>
[url "[email protected]"]
insteadOf = [email protected]
Acá agregaremos algo adicional, y es un subhost personalizado. Debemos de tenerlo en cuenta para un paso que haremos más adelante.
¡Ya casi acabamos, queda poco
Ahora debemos de decirle a git que cuando creemos o descarguemos un proyecto sepa que cuenta usar, y para esto debemos automatizarlo, para no tener que hacerlo manualmente cada que creemos o descargaremos proyectos.
Para esto debemos definir que cuando creemos o descargamos un proyecto en una ruta, tome una configuración de cuentas; y de hacerlo en otra ruta tome otra configuración de cuentas
Puedes definir lo de la siguiente manera:
Vas a crear una carpeta en la ruta que tú quieras almacenar todos tus proyectos personales, para simplicidad en este tutorial lo haremos así, pero recuerda que tú puedes en cualquier ruta.
~/Personal/
Esta será la ruta en donde yo guardare mis proyectos personales~/Trabajo/
Esta será la ruta en donde yo guardare los proyectos que tengan que ver con el trabajoPara crear las carpetas de manera rápida puedes usar el siguiente comando en tu terminal:
mkdir ~/Personal ~/Trabajo
Ahora a nuestro archivo .gitconfig
el que es el general, el archivo base, le agregaremos las siguientes lineas:
[include]
# Valor por default para git; de esta manera, por defecto siempre usaremos nuestra cuenta personal
path = ~/.gitconfig.personal
[includeIf "gitdir:~/Trabajo/"]
# Todos los proyectos que descarguemos o creemos a partir de esta ruta, usara tu cuenta de tu trabajo
path = ~/.gitconfig.trabajo
[includeIf "gitdir:~/Personal/"]
# Todos los proyectos que descarguemos o creemos a partir de esta ruta, usara tu cuenta personal# este bloque es opcional, pero debes de asegurarte de colocar el primer bloque.
path = ~/.gitconfig.personal
[init]
defaultBranch = main
...
[other configs]
...
Ahora debemos modificar o crear un archivo config dentro de tu carpeta ~/.ssh
y escribe lo siguiente:
Puedes usar el siguiente comando:
nano ~/.ssh/config
Host github.com
User <your github username personal account>
HostName github.com
# La ruta a tu llave privada asociada a tu cuenta personal
IdentityFile ~/.ssh/id_rsa_personal
# Este host tiene que ser el mismo que pusimos en el paso tres
Host trabajo.github.com
User <your github username work account>
HostName github.com
# La ruta a tu llave privada asociada a tu cuenta de trabajo
IdentityFile ~/.ssh/id_rsa_trabajo
Host *
AddKeysToAgent yes
IdentitiesOnly yes
UseKeychain yes
Compression yes
PreferredAuthentications publickey
¡Felicidades, eso sería todo! ¡No olvides agregar tus llaves públicas a tus cuentas de GitHub!
Si quieres probar que todo este OK, lo podemos hacer desde nuestra terminal, solo debemos de correr los siguientes comandos:
ssh -T [email protected]
ssh -T [email protected]
Lo que debería de salirte sería algo así, para cada cuenta:
The authenticity of host github.com (#######) can not be established.
###### key fingerprint is SHA256
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? **yes**
Warning: Permanently added github.com (####) to the list of known hosts.
Hi <Yourgithubusername>! You've successfully authenticated, but GitHub does not provide shell access.
Repasa qué es Git bash
Ahora ya sabes como agregar más de una cuenta de GitHub / GitLab a una misma computadora. Recuerda que puedes ver nuestro curso profesional de Git & GitHub y seguir aprendiendo a emplear esta herramienta como toda una profesional.
Déjame saber en los comentarios si te gusto este post y que tipo de temas te gustaría aprender en mi próximo artículo para que nunca paremos de aprender.
Que buena y util explicación, valiosa información, gracias Juan.
Gracias a ti Javier por leer!
Llevo días, y varios intentos tratando de hacer esto que ha explicado @juansacdev de forma tan clara y concreta. Sin ni siquiera probarlo todavía, le felicito por este post y voy a seguir paso a paso sus notas para implementarlo.
Muchas gracias.
Por cosas como estas uso Platzi.
Execelente explicacion Juan, super sencillo de seguir. Gracias por compartir tus conocimientos.
Ohh, ya no tengo que recurir a otro pc para hacer mi curso de Git & Github.
Gracias!!!
Que bueno que te fue util!
Buenas! Es un excelente tutorial, pero me surge una duda que es lo que me está trancando:
signingKey = <Your signingKey>
¿A qué se refiere con signingKey? ¿Cómo se cuál es?
Saludos
Gracias! tenia la misma duda.
Esta buenísimo Juanse! Espero ver más blogs tuyos 😄
Muchas gracias Alex! Claro que sí. Ya estoy trabajando en el proximo post! 👨🏻💻
Podemos automatizar el inicio del shh-agente además del agregado de llaves (ssh-add) creando el archivo
.bashrc
en la carpeta de nuestro usuario de Windows %user_profile%/.bashrc, si deseas crear dicho archivo desde bash con git, puedes usar# Para crear y editar el archivo usamos: touch ~/.bashrc && vim ~/.bashrc # El comando anterior se puede entender como: Crea el archivo .bashrc en el carpeta del usuario del S.O y si no hubo errores enla creación abre el archivo con vim
Luego solo habría que copiar el siguiente codigo brindado por la documentación de github para automatizar el proceso, solo que para este caso lo modifique un poco para poder agregar todas las llaves ssh que se hayan creado
env=~/.ssh/agent.env agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; } agent_start () { (umask 077; ssh-agent >| "$env") . "$env" >| /dev/null ; } agent_load_env # agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2=agent not running agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?) # Este if solo valida que el ssh-agent se este ejecutando, si no lo esta lo ejecuta if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then agent_start ssh-add ~/.ssh/id_rsa # especificamos la ruta de nuestra llave privada y su nombre ssh-add ~/.ssh/id_rsa_trabajo # ruta para otra llave y su nombre # Así para todas las llaves quese vayan creando .. # Este ifse ejecutad cuando el ssh-agent se esta ejecutando elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then # Todas las llaves agregadas en el if anterior tambiénse deben agregar en este ssh-add ~/.ssh/id_rsa # especificamos la ruta de nuestra llave privada y su nombre ssh-add ~/.ssh/id_rsa_trabajo # ruta para otra llave y su nombre # Así para todas las llaves quese vayan creando .. fi unset env
Muy util para el trabajo en equipo o si tienes mas de un computador.
Realice todo el proceso paso a paso, todo salio bien en las validaciones, tanto en la personal como en la de trabajo.
Pero me encuentro estre error cuando quiero interactuar con git desde el proyecto:
fatal:bad config line17 in file /home/carlosv22/.gitconfig
Adjunto el archivo al cual el error hace referencia:
En la linea 17 solo hay … (tres puntos)
[include] # Valor por default para git; de esta manera, por defecto siempre usaremos nuestra cuenta personal path = ~/.gitconfig.personal [includeIf "gitdir:~/Trabajo/"] # Todos los proyectos que descarguemos o creemos a partir de esta ruta, usara tu cuenta de tu trabajo path = ~/.gitconfig.trabajo [includeIf "gitdir:~/Personal/"] # Todos los proyectos que descarguemos o creemos a partir de esta ruta, usara tu cuenta personal # este bloque es opcional, pero debes de asegurarte de colocar el primer bloque. path = ~/.gitconfig.personal [init] defaultBranch = master ... [other configs] ...
Hola, sería ideal actualizar este post o uno nuevo donde se configuren 2 cuentas; una en Github y otra en BitBucket.
Excelente aporte!! No sabía que lo necesitaba.
Al validar la configuración obtuve el error
Bad configuration option: usekeychain
, asi que ingresé nuevamente al archivonano ~/.ssh/config
y eliminé la líneaUseKeychain yes
. Luego de esto repetí las validaciones y el mensaje de exito que obtuve fueYou've successfully authenticated, but GitHub does not provide shell access
Un aporte super util!!
justo acabo de terminar el curso y estoy viendo este gran aporte…
Gracias Hermano…
la llave signingKey de donde la obtengo? te agradeceria
Hola, es necesario tener un dominio personalizado? tengo dos cuentas diferentes asociadas a dos emails diferentes, hice todo el procedimiento y cuando hago las verificaciones, no se como hacerlo ya que estas dependen del dominio.
digamos tenia la cuena personal ahora adicione la cuenta trabajo sin host personalizado y cuando corro
ssh -T [email protected]
me muestra el usuario de la cuenta trabajo, no se si quedo truncado o como verificarlo.gracias por la info, muy util el post
Muy útil, gracias por este post.
Hola muchas gracias por el tutorial, realice todo el proceso sin embargo solo me funciona la cuenta que tenga configurada en el include por default las las otras no me funcionan
[includeIf “gitdir:~/documents/projects/rujopayroll/”]
<h1>Todos los proyectos que descarguemos o creemos a partir de esta ruta, usara tu cuenta de tu trabajo</h1>path = ~/.gitconfig.trabajo
[includeIf “gitdir:~/documents/projects/personals/”]
<h1>Todos los proyectos que descarguemos o creemos a partir de esta ruta, usara tu cuenta personal</h1> <h1>este bloque es opcional, pero debes de asegurarte de colocar el primer bloque.</h1>path = ~/.gitconfig.personal
[include]
<h1>Valor por default para git; de esta manera, por defecto siempre usaremos nuestra cuenta personal</h1>path = ~/.gitconfig.trabajo
en este caso por ejemplo puedo hacer pull and push a la cuenta de trabajo pero no a la personal, si cambio en el include por default a personal me deja hace solo push y pull a la cuenta personal, es decir no me funcionan los dos al mismo tiempo.
Muchas gracias si alguien me puede guiar.
Cordial saludo
Buenas noches, saludos, excelente explicación, te pregunto esos pasos también sirve para una cuenta que tengo github y otra que tiene mi esposa? se debe agregar algo más? Gracias
Gracias por el tutorial, sigue funcionando en el 2023! 🙌🏻