📆 ⏱️ 4 min de lectura

🔐 Múltiples Claves GPG en Git

Cómo gestionar automáticamente claves GPG diferentes para trabajo y proyectos personales

¿Has visto alguna vez esos commits con la marca “Verified” en GitHub y te has preguntado cómo conseguirlo?

Yo quería conseguir eso en el trabajo, así que configuré GPG para firmar mis commits y me gustó tanto ver esa marca verde que pensé “esto también lo quiero en mis proyectos personales”.

El problema es que para el trabajo uso el email corporativo, pero para mis proyectos personales quiero usar el mío personal.

💡 La solución

Git tiene una característica llamada includeIf que aplica configuraciones diferentes según el directorio donde estés. Básicamente le dices “si estoy en esta carpeta, usa esta configuración”. Así que vamos a ello…

1. 🔑 Crear las claves

Lo primero de todo, si no tienes claves GPG, es crearlas. En Mac uso GPG Keychain que hace todo más sencillo.

  1. Crear primera clave con tu email de trabajo
  2. Crear segunda clave con tu email personal

Te va a pedir contraseñas para ambas, y es mejor que las recuerdes bien porque la primera vez que hagas un commit con esta nueva configuración te las va a pedir.

2. 🔑 Añadir las claves a GitHub

Ahora nos vamos a nuestra configuración GPG de GitHub

  • creamos una nueva GPG key para work pulsando en New GPG key
  • le ponemos un nombre, work en para este caso
  • copiamos nuestra recién creada key
  • puedes copiarlas muy fácilmente desde GPG Keychain con botón derecho y Copy.repetimos el proceso para personal.

⚠️ Revisa que copies la key que corresponde desde GPG Keychain, el email te dará la clave.

Si usáis GitLab, como es mi caso para este blog, y no, no sé qué razón me llevó a hacer tal cosa 🤷🏻‍♀️, funciona de la misma manera.

3. 🗂️ Organizar los proyectos

Separé físicamente mis proyectos, esto es esencial para utilizar después el includeIf que te he comentado antes.

mkdir -p ~/work     # Para el trabajo
mkdir -p ~/personal # Para proyectos personales
4. 🆔 Encontrar los IDs de las claves GPG

Esto lo puedes ver en la configuración GPG de GitHub (la captura de más arriba) o mediante este comando:

gpg --list-secret-keys --keyid-format LONG

Esto te muestra algo como:

sec   rsa4096/1234567890ABCDEF 2023-01-01 [trabajo]
sec   rsa4096/FEDCBA0987654321 2023-01-01 [personal]

El signingkey es lo que viene después de la / en la línea que empieza por sec.

5. ☝️ Crear configuraciones específicas

Para el trabajo (~/.gitconfig-work):

[user]
    name = Tu Nombre Profesional
    email = tu-email@empresa.com
    signingkey = 1234567890ABCDEF

[commit]
    gpgsign = true

Para proyectos personales (~/.gitconfig-personal):

[user]
    name = Tu Nombre
    email = tu-email-personal@gmail.com
    signingkey = FEDCBA0987654321

[commit]
    gpgsign = true
6. 🪄 Configuración condicional

Editas tu ~/.gitconfig principal y añades:

[includeIf "gitdir:/Users/tu-usuario/work/"]
    path = /Users/tu-usuario/.gitconfig-work
[includeIf "gitdir:/Users/tu-usuario/personal/"]
    path = /Users/tu-usuario/.gitconfig-personal

Importante: Usa rutas absolutas, no ~. Git a veces tiene problemas con la expansión de ~ en estas configuraciones.

Al final tu estructura de directorios queda así:

~/
├── work/
│   ├── proyecto-empresa-1/
│   └── proyecto-empresa-2/
├── personal/
│   ├── mi-app-personal/
│   └── otro-proyecto/
├── .gitconfig           # Configuración con includeIf
├── .gitconfig-work      # Configuración trabajo
└── .gitconfig-personal  # Configuración personal

💫 ¡Y voilà!

Ahora cuando estoy en cualquier proyecto dentro de ~/personal/, Git automáticamente usa mi email personal y mi clave GPG personal. Lo mismo para ~/work/ con la configuración de trabajo.

cd ~/personal/mi-app
git config user.email
# tu-email-personal@gmail.com

cd ~/work/proyecto-empresa  
git config user.email
# tu-email@empresa.com

# Ver qué configuración está usando Git
git config --list --show-origin | grep user

# Verificar la última firma
git log --show-signature -1

⚠️ Problemas comunes

  1. Rutas: Asegúrate de usar rutas absolutas completas
  2. Configuración global: Elimina cualquier configuración global que interfiera:
    git config --global --unset user.email
    git config --global --unset user.signingkey
    
  3. Repositorio: La configuración condicional solo funciona dentro de repositorios Git, no en carpetas vacías.