98

Cómo agregar múltiples cuentas Git y GitHub en la misma computadora

26993Puntos

hace 2 años

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.

Primeros pasos

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.

1. Creando nuestras llaves privadas

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

2. Editando el archivo .gitconfig

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]
...

3. Añadiendo nuestras propias configuraciones

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

4. Definiendo las rutas de trabajo

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 trabajo

Para 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]
...

5. Agregando la configuración de ssh

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!

Validaciones

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.

Juan Sebastián
Juan Sebastián
juansacdev

26993Puntos

hace 2 años

Todas sus entradas
Escribe tu comentario
+ 2
Ordenar por:
6

Que buena y util explicación, valiosa información, gracias Juan.

2
26993Puntos
2 años

Gracias a ti Javier por leer!

3

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

1
2704Puntos
un año

Gracias! tenia la misma duda.

3
3648Puntos

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.

3
4652Puntos

Execelente explicacion Juan, super sencillo de seguir. Gracias por compartir tus conocimientos.

3
23204Puntos

Ohh, ya no tengo que recurir a otro pc para hacer mi curso de Git & Github.
Gracias!!!

2
26993Puntos
2 años

Que bueno que te fue util!

3
52091Puntos

Esta buenísimo Juanse! Espero ver más blogs tuyos 😄

2
26993Puntos
2 años

Muchas gracias Alex! Claro que sí. Ya estoy trabajando en el proximo post! 👨🏻‍💻

2
9142Puntos

Hola, sería ideal actualizar este post o uno nuevo donde se configuren 2 cuentas; una en Github y otra en BitBucket.

2
317Puntos

Al validar la configuración obtuve el error Bad configuration option: usekeychain, asi que ingresé nuevamente al archivo nano ~/.ssh/config y eliminé la línea UseKeychain yes. Luego de esto repetí las validaciones y el mensaje de exito que obtuve fue You've successfully authenticated, but GitHub does not provide shell access

2
8996Puntos

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]
...
2
8911Puntos

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
2
8466Puntos

Excelente aporte!! No sabía que lo necesitaba.

2
8652Puntos

Muy util para el trabajo en equipo o si tienes mas de un computador.

1

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

1
21332Puntos

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

1
47006Puntos

Gracias por el tutorial, sigue funcionando en el 2023! 🙌🏻

1

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.

1
2 años

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

1
8667Puntos

justo acabo de terminar el curso y estoy viendo este gran aporte…

Gracias Hermano…

1

la llave signingKey de donde la obtengo? te agradeceria