DEV Community

Cover image for Cómo usar varias SSH keys para diferentes repositorios de GitHub (o GitLab)
José María CL
José María CL

Posted on • Edited on

Cómo usar varias SSH keys para diferentes repositorios de GitHub (o GitLab)

Introducción

Hola. Hoy veremos algunas configuraciones para trabajar con repositorios de diferentes cuentas de GitHub o GitLab.

Git y GitHub nos sugieren una configuración global y general que es útil para la gran mayoría de los usuarios:

  1. Instalar Git
  2. Configurar el name y el email globales para la firma de commits
  3. Generar keys SSH personales
  4. Configurar las keys en GitHub
  5. Clonar el repo con SSH
  6. Ser felices

Sin embargo, hay un caso más o menos común en el que, ya sea por el trabajo o proyectos personales, tenemos que trabajar con diferentes cuentas de GitHub o GitLab, con diferente usuario o correo en la firma, y desde la misma computadora.

Resúmen

El truco es simple. Se trata de algunos ajustes de configuración SSH y de Git:

  • (SSH) Generar una key SSH diferente para cada cuenta de GitHub
  • (SSH) Crear un archivo de configuración SSH global
  • (Git) Configurar el remote origin de cada repositorio
  • (Git) Settear el name y el email para cada repositorio

⚠️ Consideraciones

En este post usaremos el remote con SSH. Si ya clonaste el repositorio usando la opción HTTPS dirígete al final del post para cambiar la URL del remote y poder continuar con el tutorial.

Para verificar qué tipo de clonación escogiste cuando clonaste el repo, lo puedes averiguar llendo a tu repositorio en la terminal y usando el comando git remote -v:

En este ejemplo podemos ver que en la salida aparece https, lo que significa que tendríamos que cambiar la url para que sea ssh.

# Navegar al repositorio
cd ~/Documents/work/git-tricks-and-tutorials

# Mostrar el remote
git remote -v
# origin    https://github.com/ChemaCLi/git-tricks-and-tutorials.git (fetch)
# origin    https://github.com/ChemaCLi/git-tricks-and-tutorials.git (push)
Enter fullscreen mode Exit fullscreen mode

Objetivo del ejercicio

Supongamos que tenemos 2 cuentas de GitHub: Una cuenta personal y una cuenta del trabajo. Lo que haremos es crear una configuración personal para la cuenta personal, y una configuración work para la cuenta de nuestro trabajo.

1. Generar y preparar las nuevas keys SSH

Lo primero que debemos hacer es navegar a la carpeta .ssh de nuestra computadora.

El directorio .ssh debe estar en la ruta raíz de tu usuario. Si no la puedes ver, asegúrate de que la opción "Ver archivos ocultos" esté habilitada en tu Sistema Operativo (MacOS, Linux o Windows).

ssh directory example

Dentro del directorio .ssh encontrarás los archivos id_rsa y id_rsa.pub.

Si no existen, revisa la sección de Consideraciones de este post por favor.

list of keys in explorer

En mi caso estas son las keys que uso para mis proyectos personales, así que crearé una carpeta personal para colocarlas allí, y crearé una carpeta work para la cuenta del trabajo

keys organized in folders

Lo siguiente será crear una nueva key SSH para el trabajo (usando el email de mi trabajo) con los siguientes comandos:

# Navega a la carpeta .ssh/work
cd ~/.ssh/work
# Genera la nueva key allí dentro
ssh-keygen -t rsa -b 4096 -C "chema@devu.community"
Enter fullscreen mode Exit fullscreen mode

Al presionar Enter nos preguntará qué nombre le queremos dar al archivo. Te sugiero que le pongas el nombre de la empresa de tu trabajo para evitar confusiones. Usaré "devu" en mi caso.

Enter file in which to save the key (/Users/chema/.ssh/id_rsa): devu
Enter fullscreen mode Exit fullscreen mode

Presiona Enter un par de veces para continuar sin poner una contraseña, o especifica una si lo prefieres.

Ahora tendrás tus keys ssh organizadas de esta manera:
keys organized in folders

Lo siguiente por hacer es agregar la nueva SSH key en tu cuenta de GitHub del trabajo. Si no sabes cómo hacerlo, puedes seguir las instrucciones del paso 4 de la guía que escribí en este otro post:

2. Archivo config SSH

La clave y la magia de todo lo que estamos haciendo recae en gran parte sobre este paso, así que presta atención.

Crea un archivo de texto plano con el nombre config dentro de tu carpeta .ssh. Asegúrate de que no tenga la extensión .txt o cualquier otra. El nombre del archivo debe ser config únicamente.

config file created

Ahora ábrelo con el editor de texto de tu preferencia (Bloc de notas, Editor, VSCode, Sublime Text, etc.) y escribe este contenido, poniendo el nombre de tu empresa en lugar de "devu":

# Configuracion de GitHub para mi cuenta Personal
Host github.com-personal
  HostName github.com
  User git
  IdentityFile ~/.ssh/personal/id_rsa

# Configuracion de GitHub para mi trabajo en Devu
Host github.com-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/work/devu
Enter fullscreen mode Exit fullscreen mode

Guarda los cambios y cierra el archivo.

Presta mucha atención a este detalle. Estamos usando un Host github.com-personal y un Host github.com-work. El sufijo -personal y -work le servirá a Git para escoger qué keys usar más adelante.

Además, el IdentityFile de cada configuración debe coincidir con los nombres de las carpetas y keys que creamos.

3. Configurar el remote origin del repositorio

Si vas a clonar/descargar el repo por primera vez

Escribe en la terminal el comando de git clone, pega la URL de tipo SSH, y modifícala para que el host quede como github.com-work si es un repo de tu cuenta del trabajo, o github.com-personal si es tu repo de la cuenta personal.

git clone git@github.com-work:ChemaCLi/git-tricks-and-tutorials.git
Enter fullscreen mode Exit fullscreen mode

Si ya tienes el repo clonado/descargado

Escribe en la terminal los siguientes comandos para navegar a tu repositorio, verificar la URL del remote origin, y modificarla para que utilice la configuración work que definimos en el paso 2.

Para este ejercicio usaré un repositorio llamado "git-tricks-and-tutorials", y tú deberías usar el repositorio que te interesa configurar.

# Navegar al repositorio
cd ~/Documents/work/git-tricks-and-tutorials/

# Verificar el remote origin
git remote -v
# Aparecerá algo como esto
# origin    git@github.com:ChemaCLi/git-tricks-and-tutorials.git (fetch)
# origin    git@github.com:ChemaCLi/git-tricks-and-tutorials.git (push)

# Modificar la URL para que ahora use el host github.com-work
git remote set-url origin git@github.com-work:ChemaCLi/git-tricks-and-tutorials.git
Enter fullscreen mode Exit fullscreen mode

Ahora verifica la nueva configuración del remote origin de Git.

git remote -v
# origin    git@github.com-work:ChemaCLi/git-tricks-and-tutorials.git (fetch)
# origin    git@github.com-work:ChemaCLi/git-tricks-and-tutorials.git (push)
Enter fullscreen mode Exit fullscreen mode

Y finalmente valida que puedas comunicarte con GitHub haciendo git pull:

git pull --ff
# Already up to date.
Enter fullscreen mode Exit fullscreen mode

Si te arroja un error, por favor escríbelo en los comentarios y responderé de inmediato para ayudarte y corregir la guía.

4. Settear firma de Git para el repositorio actual

Último paso para detalles finos. Si has logrado llegar hasta aquí, felicidades! solo nos queda un pequeño detalle más para contar con una configuración completa.

Vamos a hacer que el nombre y el email que aparecen en cada commit sea diferente para nuestro repositorio (en este caso el repo del trabajo)

Ingresa estos comandos para settear tu firma para el repositorio del trabajo:

git config user.email chema@devu.community 
git config user.name ChemaCL
Enter fullscreen mode Exit fullscreen mode

Verifica la configuración con el comando git config --list:

# Esta configuración aparecerá hasta abajo
remote.origin.url=git@github.com-work:ChemaCLi/git-tricks-and-tutorials.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.main.remote=origin
branch.main.merge=refs/heads/main
user.email=chema@devu.community
user.name=ChemaCLi
Enter fullscreen mode Exit fullscreen mode

Lo lograste! a partir de ahora cuando hagas pull o push usarás la SSH de tu trabajo para el repositorio del trabajo, y firmarás tus commits con los datos de tu trabajo.

Verification of sign

Ahora intenta configurar el remote origin tus repositorios de tu cuenta personal para que usen la ssh de la carpeta personal. Puedes lograrlo siguiendo el paso 3 de esta guía. También recuerda que debes modificar el remote origin de todos los repositorios que hayas clonado. Pero descuida, solo tienes que hacerlo cuando lo necesites, no vayas a enloquecer.

Si algo falló, revisa bien tus configuraciones para descargar errores en los nombres de archivos y carpetas.

Si tienes dudas, correcciones o sugerencias, envía tus comentarios de manera respetuosa y los atenderé en cuanto me sea posible. Éxito!

Cambiar de HTTPS a SSH

Lo primero que debes hacer es verificar si ya tienes configurada una key SSH antes de continuar. También tendrás que asegurarte de configurar la key en la cuenta de GitHub del repositorio que estás intentando cambiar.

Para ello te recomiendo seguir esta otra guía a partir del paso 3:

Cuando tu key SSH esté configurada en GitHub, lo siguiente es dirigirte a tu repositorio en GitHub, buscar la opción Clone y copiar la URL ssh.

En este caso mi URL para trabajar con SSH es esta:

git@github.com:ChemaCLi/git-tricks-and-tutorials.git
Enter fullscreen mode Exit fullscreen mode

Example in github of ssh clone

Ahora debes navegar al directorio en donde se encuentre clonado tu repositorio y asignar la nueva URL al remote origin.

git remote set-url origin git@github.com:ChemaCLi/git-tricks-and-tutorials.git
Enter fullscreen mode Exit fullscreen mode

Listo, ya estás usando ssh a partir de ahora. Para verificar la configuración escribe el comando git remote -v y deberías ver una salida como la siguiente:

git remote -v
# origin    git@github.com:ChemaCLi/git-tricks-and-tutorials.git (fetch)
# origin    git@github.com:ChemaCLi/git-tricks-and-tutorials.git (push)
Enter fullscreen mode Exit fullscreen mode

Recuerda que un remote es simplemente un repositorio remoto con el que te puedes comunicar para sincronizar cambios. Y el remote llamado origin es simplemente el remote principal.

Top comments (0)