Usar distintas credenciales ssh con Git

Como freelancer, no es extraño que en algún momento te veas en la necesidad de trabajar en el  repositorio remoto de alguna empresa mientras mantienes también uno para tus propios proyectos. En estos casos es posible que ambos esten en servicios diferentes (Github y Bitbucket, por ejemplo) o que simplemente te hayan asignado un correo distinto al tuyo para trabajar con estos repositorios. Incluso es posible -como es mi caso-, que uses el mismo servicio que la compañía con la que trabajas, pero al usar distintos usuarios, no es posible utilizar la misma credencial ssh para ambos perfiles y debas crear una para cada usuario.

Si éste es tu problema, te habrás dado cuenta que no te es posible, así como así, decirle a Git cuál credencial debería usar para cuál cuenta. En mi caso, se sumó el inconveniente de que necesitaba hacer esto en Windows y la mayor parte de la información en la red (que no es abundante precisamente) está centrada en sistemas *NIX, lo que significó un trabajo extra pero que realmente no lo hace más complicado una vez  que lo entiendes.

Importante: Este no es un artículo sobre cómo usar Git. Si te has encontrado con este problema, seguramente ya entiendes algo de Git (al menos lo básico), si no es así, te recomiendo que veas la documentación en http://git-scm.com/

Crear las credenciales

Para crear las credenciales es necesario que tengamos instalado SSH. Si trabajas con Linux o Mac no debes preocuparte porque viene preinstalado, igual que Git (sí es buena asegurarte que trabajas con la versión más reciente), si trabajas con Windows puedes matar dos pájaros de un tiro instalando Git. El sitio oficial de  Git es http://git-scm.com/, donde también puedes mirar la instalación para Linux, OS X y Solaris en la sección de Downloads. También puedes hacer uso de su documentación si estás aprendiendo  cómo usarlo.

Dos consejos a los usuarios de Windows:

  1. Selecciona correr Git usando msysgit. De esa manera no harás cambios mayores al sistema y podrás echar mano de otros comandos propios de Unix.
  2. Selecciona convertir el fin de línea (Windows finaliza los archivos de manera distinta a *NIX, lo que puede ser un problema si trabajas en grupo o en un proyecto Open Source, donde encontrarás gente trabajando en Linux o Mac). No te preocupes, no interferirá con tu trabajo.

Una vez que tenemos lo que necesitamos, abrimos la terminal (o símbolo de sistema, en Windows) y ejecutamos el siguiente comando:

ssh-keygen -t rsa

Lo primero que nos pedirá es que le digamos dónde queremos que guarde el archivo, mostrándonos la dirección y el nombre por defecto. Por defecto, las credenciales se guardan en /home/nombre_de_usuario/.ssh (C:\Users\nombre_de_usuario\.ssh en Windows), guardémoslas  allí. Si vas  a ponerle un nombre distinto al nombre por defecto, debes colocar también la dirección donde se guardará, de lo contrario, se guardará en la carpeta en la que estás en ese momento.

Una vez colocado el nombre, te pedirá que coloques una contraseña para proteger el archivo, lo que es muy buena idea si vas a usar estos archivos en una máquina compartida, en la laptop u otro sitio suceptible de que alguien más pueda usarlos sin tu permiso.

Si todo sale bien,  en la carpeta correspondiente  tendrás el archivo que creaste, sin extensión, más otro del mismo nombre con extensión .pub. Este segundo archivo es la clave pública, que en algunos casos podrás subir al servidor remoto al que quieres comunicarte para hacer la verificación.

Pero ¿qué pasa si el servidor remoto no me deja subir el archivo? Simplemente abres el archivo pub en el editor de texto, copias la clave y la pegas donde corresponda.

Vincular la credencial con la cuenta correspondiente

Bien, ya tenemos nuestras credenciales, ahora lo que necesitamos es vincular cada una de ellas con la cuenta correspondiente, de modo que  Git  sepa cuál debe usar en cada caso.

Lo primero que haremos es crear un archivo config en la carpeta .ssh, esto puedes hacerlo desde el terminal, usando el comando:

vim ~/.ssh/config

que abrirá el archivo config o lo creará en caso de que no lo encuentre. Claro, puedes usar el editor de texto que prefieras, es sólo un archivo de texto plano.

Ahora, para cada una de las cuentas, colocaremos lo siguiente:

Host nombre_de_nuestro_host
  Hostname host_del_servicio #bitbucket.org, github.com o el que corresponda
  User git
  IdentityFile dirección_de_la_credencial #p.e. C:/Users/CharlieSheen/.ssh/just_wining_duh_rsa
  IdentitiesOnly yes

Una rápida explicación:

Host: El nombre que desees agregarle a cada cuenta, queda de tu parte. Mi recomendación es que sea corto, para que no tengas que estar escribiendo de más cuando te toque escribir la dirección, yo uso cosas como freelance, github o el nombre de la compañía a la que corresponde la cuenta. Por supuesto, sin espacios ni caracteres especiales. Este nombre va a reemplazar el host y el nombre de usuario en la dirección git. Luego veremos cómo.

Hostname: El host del repositorio: Bitbucket (bitbucket.org), Github (github.com), etc. Recuerda, es el nombre del host, no la url. Nada de http-https, etc.

User: El nombre del usuario usado en el repositorio. Normalmente es git (como en git@github.com:usuario/repositorio.git), pero podría cambiar dependiendo de cómo esté configurado, lo sabrás viendo la dirección git.

IdentityFile: La dirección de la credencial correspondiente a esta cuenta. Para evitar posibles problemas, es recomendable usar la dirección absoluta). Recuerda, debe ser el archivo de credencial privado, no el público (*.pub)

IdentitiesOnly: Le dice a ssh que sólo debe ofrecer la(s) credencial(es) que está(n) en IdentityFile, evitando exponer cualquier otra llave cargada en el agente ssh, por ejemplo.

Una vez que hayas seguido estos pasos para todas las cuentas que quieres usar, guarda el archivo. En vim usas

:wq

Usar las cuentas vinculadas

Bien, lo difícil ya pasó, lo que debemos hacer ahora es utilizar los vínculos que hemos creado para acceder a nuestros repositorios. Tan simple como esto:

Digamos que nuestro repo es git@github.com:thefricky/wp-simple-twitter-widget.git

Lo que haremos es, a la hora de clonar o asignar el repositorio remoto, cambiar el nombre de usuario (git) y el nombre del host (github.com) por el nombre de host que hemos puesto, quedando nombre_de_nuestro_host:thefricky/wp-simple-twitter-widget.git.

Es decir, si este host lo usas para tus proyectos Open Source y lo llamaste opensource, la dirección que usarás en git será opensource:thefricky/wp-simple-twitter-widget.git

Y eso es todo, en adelante usarás Git como de costumbre sin tener que preocuparte de ser rechazado por el repositorio por culpa de las credenciales.

Happy Coding!

 

Technorati Tags: ,,


Deja un comentario