Repositorios remotos/locales git con ssh

Actualmente existen varios servicios de hospedaje gratuito para
repositorios git, el único requisito es que nuestros proyectos sean
opensource. Pero si no queremos que algún proyecto sea público, ya
sea porque X o Y razón, tendríamos que pagar una módica
cantidad.

Aunque es un precio accesible, algunos si somos bien
<del>pobres</del> codos y por otro lado, si tenemos otro lugar para
hospedarlo nos podemos ahorrar esos loritos para otra
ocasión.
Esta receta puede llevarse a cabo tanto local como remotamente,
para comenzar necesitaremos únicamente de git y un servidor ssh,
los cuales en debian y derivados se instalan de esta manera:

# apt-get install git-core openssh-server

Para crear los repositorios nos conectaremos al servidor remoto.
En mi caso hice esto localmente y decidí agregar el usuario git, ya
que en mi disco duro tengo una partición dedicada para /home.

$ ssh [email protected]

Y ejecutamos los siguientes comandos:

$ mkdir test-project.git
$ cd test-project.git
$ git --bare init   # inicializamos el repositorio remoto

Con eso ya tenemos nuestro repositorio funcionando, ahora vamos
a commitear algunos archivos:

$ cd projects
$ mkdir test-project
$ cd test-project
$ git init                                                      # inicializamos el repositorio local
$ git remote add origin [email protected]:test-project.git    # agregamos el repositorio remoto
$ echo 'Hello World!' > README
$ git add README
$ git commit -m 'first push'
$ git push origin master

Si todo ha ido bien, veremos algo como:

[email protected]'s password:
Counting objects: 3, done.
Writing objects: 100% (3/3), 221 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:test-project.git
           [new branch]      master -> master

Nuestro repositorio está trabajabdo bien, el password obviamente
es el que le hayamos designado al usuario que creamos.

¿Pero que pasa si otros van a colaborar en mi proyecto?

Tienes dos opciones: La número uno sería que les hagas saber el
password de dicho usuario, pero estar escribiendolo cada vez que
vayamos a pushear algo es molesto.

La número dos y la más recomendable: Usar SSH-KEYS.
A saber, existen dos tipos de llaves, DSA y RSA, sea cual sea
nuestra elección, el procedimiento para crear un par de llaves es
la siguiente:

$ ssh-keygen -t dsa                                                             # cambiar por rsa según nuestra elección
Generating public/private dsa key pair.
Enter file in which to save the key (/home/kelevra/.ssh/id_dsa): .ssh/git_dsa   # no es obligatorio especificar ubicación
Enter passphrase (empty for no passphrase):                                     # escribimos una clave para usar la llave
Enter same passphrase again:                                                    # y la escribimos  de nuevo para confirmar
Your identification has been saved in .ssh/git_dsa.
Your public key has been saved in .ssh/git_dsa.pub.

Hemos generado una llave pública y una privada, la pública es la
que copiaremos al servidor remoto:

$ scp .ssh/id_dsa.pub [email protected]:.ssh/authorized_keys2
[email protected]'s password:
id_dsa.pub                                    100%  608     0.6KB/s   00:00

Ahora ya no nos pedirá el password del usuario cada vez que
hagamos push o nos conectemos para crear un nuevo repositorio, en
su lugar nos pedirá la clave que le asignamos a nuestro par de
llaves. Pero aún tenemos que escribir un password, sin embargo
podemos usar ssh-agent que recordará por determinado
tiempo nuestras claves, para iniciar este agente basta con teclear
en la terminal:

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-RwRst31999/agent.31999; export SSH_AUTH_SOCK;
SSH_AGENT_PID=32000; export SSH_AGENT_PID;
echo Agent pid 32000;

Ya una vez corriendo el agente agregamos nuestra llave:

$ ssh-add .ssh/git_dsa
Enter passphrase for .ssh/git_dsa:
Identity added: .ssh/git_dsa (.ssh/git_dsa)

¡Y listo! Nos conectamos de nuevo vía ssh o hacemos otro push
para comprobar que ya no nos pide el password del usuario y de la
llave ssh. Y ahora si ya tenemos nuestro servidor de repositorios
git bien sencishito y carismático