Cómo gestionar múltiples cuentas de Git (GitHub y GitLab) con diferentes llaves SSH y usuarios por carpeta

En este tutorial aprenderás a gestionar varias cuentas de Git (por ejemplo, una personal y una de empresa) utilizando **diferentes claves SSH** y **configuraciones automáticas por carpeta**, todo organizado para que no tengas que ir cambiando el usuario o los remotes a mano.

Publicado el 11 de marzo de 2025

Views
100 views
Tiempo de lectura:
Tiempo de lectura: 3 min

En este tutorial aprenderás a gestionar varias cuentas de Git (por ejemplo, una personal y una de empresa) utilizando diferentes claves SSH y configuraciones automáticas por carpeta, todo organizado para que no tengas que ir cambiando el usuario o los remotes a mano.

##✅ Objetivo

  • Tener una cuenta personal (GitHub y GitLab personal) con un mismo SSH.
  • Tener una cuenta de empresa (GitLab) con una SSH diferente.
  • Automatizar el user.name y user.email según la carpeta.
  • Usar remotes diferenciados con el SSH correcto, especialmente para la empresa.

##1. 🔑 Crear y configurar las llaves SSH

Primero, generamos las llaves (si ya lo hiciste, puedes saltarte este paso).

###1.1. Generar llave SSH personal

ssh-keygen -t rsa -b 4096 -C "tu-email-personal@example.com" -f ~/.ssh/id_rsa

###1.2. Generar llave SSH de empresa

ssh-keygen -t rsa -b 4096 -C "tu-email-empresa@example.com" -f ~/.ssh/id_rsa_empresa1

###1.3. Agregar las llaves a los agentes SSH

# Personal
ssh-add ~/.ssh/id_rsa
# Empresa
ssh-add ~/.ssh/id_rsa_empresa1

###1.4. Subir las claves públicas a las plataformas

  • GitHub/GitLab personal: Subir `~/.ssh/id_rsa.pub`.
  • GitLab empresa: Subir `~/.ssh/id_rsa_empresa1.pub`.

##2. ⚙️ Configurar SSH para usar las llaves correctas

Edita (o crea) el archivo `~/.ssh/config`:

nano ~/.ssh/config

Añade:

# Cuenta Personal (GitHub y GitLab Personal)
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa

Host gitlab.com
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_rsa

# Cuenta de Empresa (GitLab Empresa)
Host gitlab.com-empresa1
HostName gitlab.com
User git
IdentityFile ~/.ssh/id_rsa_empresa1

⚠️ Importante: Usar `gitlab.com-empresa1` como host para distinguirlo al clonar.


##3. 👤 Configurar `user.name` y `user.email` según carpeta

Edita o crea el archivo `~/.gitconfig` global:

[user]
  name = Tu Nombre Personal
  email = tu-email-personal@example.com

[includeIf "gitdir:~/Developer/empresa1/"]
  path = ~/.gitconfig-empresa1

Crea el archivo `~/[CarpetaEmpresa]/.gitconfig`:

[user]
  name = Tu Nombre Empresa
  email = tu-email-empresa@example.com

##4. 🚀 Clonar correctamente los repositorios

###4.1. Cuenta personal (GitHub y GitLab personal)

git clone git@github.com:usuario/repositorio.git
git clone git@gitlab.com:usuario/repositorio.git

###4.2. Cuenta empresa (GitLab empresa usando host personalizado)

git clone git@gitlab.com-empresa1:empresa/repositorio.git

##5. 🛠️ Corregir remotes de proyectos antiguos (script automático)

###5.1. Crear el script

#!/bin/bash

# Ruta base donde están los repositorios de empresa

BASE_DIR=~/Developer/empresa1

# Buscar todos los .git

find "$BASE_DIR" -type d -name ".git" | while read gitdir; do
  repo_dir=$(dirname "$gitdir")
echo "Corrigiendo remote en: $repo_dir"

cd "$repo_dir"

# Obtener remote actual

current_remote=$(git remote get-url origin)

# Reemplazar si es necesario

if [["$current_remote" == *"gitlab.com"* && "$current_remote" != *"gitlab.com-empresa1"*]]; then
new_remote=${current_remote/git@gitlab.com:/git@gitlab.com-empresa1:}
    echo "Cambiando remote de: $current_remote a: $new_remote"
    git remote set-url origin "$new_remote"
else
echo "Remote ya correcto o no es gitlab: $current_remote"
fi
done

###5.2. Hacerlo ejecutable

chmod +x fix-remotes.sh

###5.3. Ejecutar

./fix-remotes.sh

##6. ✅ Automatización al clonar (alias útil)

Alias en `/.bashrc` o `/.zshrc`:

alias gitempresa1='git clone git@gitlab.com-empresa1:'

Usar:

gitempresa1 empresa/repositorio.git

Con esta configuración tendrás todo organizado para trabajar con múltiples cuentas de Git sin confusiones. 🎉