16 de mayo de 2012

Instalar y configurar servidor Git con SSH en Ubuntu 12

Git es un software de control de versiones diseñado por Linus Torvalds, pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando estas tienen un gran número de archivos de código fuente. Al principio, Git se pensó como un motor de bajo nivel sobre el cual otros pudieran escribir la interfaz de usuario o front end como Cogito o StGIT. Sin embargo, Git se ha convertido desde entonces en un sistema de control de versiones con funcionalidad plena. Hay algunos proyectos de mucha relevancia que ya usan Git, en particular, el grupo de programación del núcleo Linux.
-- Wikipedia:Git --
Ok, vamos a emular un grupo de trabajo y ver como es esto de "git". Bien entonces llamare a unos amigos para que me den una mano.

A Yagami Light lo mandamos a administrar el servidor:
Ubuntu Server 12.04
Usuario: kira
IP: 192.168.1.99 
 
Por otro lado Monkey D. Luffy y Yo tomamos dos clientes:
Ubuntu Desktop 12.04
Usuario: luffy & alan
Entonces el proceso fue así:

-En el servidor-

# Instalación de Git.
kira@userver:~$ sudo apt-get install git
kira@userver:~$ git config --global user.name "Yagami Light"
kira@userver:~$ git config --global user.email kira@death-note.com

# Instalamos openssh
kira@userver:~$ sudo apt-get install openssh-server

# Creamos un usuario "git".
kira@userver:~$ sudo adduser git

# Configuramos el servidor para que acepte llaves públicas. 
# Abrimos el archivo "sshd_config":
kira@userver:~$ sudo nano /etc/ssh/sshd_config

# Agregamos llaves públicas
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# Ingresamos con el usuario "git" y nos movemos al "home" del usuario:
kira@userver:~$ su git
git@userver:/home/kira$ cd ~

# Creamos la carpeta oculta "ssh":
git@userver:~$ mkdir .ssh

# Creamos el archivo "authorized_keys":
git@userver:~$ touch .ssh/authorized_keys

# Creamos una carpeta para guardar las llaves publicas que nos envíen.
git@userver:~$ mkdir clientes

 

-En el cliente Monkey D. Luffy-

# Instalación de Git.
luffy@one-piece:~$ sudo apt-get install git
luffy@one-piece:~$ git config --global user.name "Monkey D. Luffy"
luffy@one-piece:~$ git config --global user.name luffy@one-piece.com

# Generamos llave pública y la enviamos al servidor.
luffy@one-piece:~$ ssh-keygen -t rsa
luffy@one-piece:~$ scp /home/luffy/.ssh/id_rsa.pub git@192.168.1.99:clientes/luffy_rsa.pub

 

-En el cliente Alan Tello Oyola (yo)-

# Instalación de Git.
alan@ax2to:~$ sudo apt-get install git
alan@ax2to:~$ git config --global user.name "Alan Tello Oyola"
alan@ax2to:~$ git config --global user.name alan.tello@gmail.com

#Generamos llave pública y la enviamos al servidor.
alan@ax2to:~$ ssh-keygen -t rsa
alan@ax2to:~$ scp /home/alan/.ssh/id_rsa.pub git@192.168.1.99:clientes/alan_rsa.pub

 

-En el servidor-

# Agregamos las llaves públicas recibidas a "authorized_keys":
git@userver:~$ cat clientes/luffy_rsa.pub >> .ssh/authorized_keys 
git@userver:~$ cat clientes/alan_rsa.pub >> .ssh/authorized_keys 

# Terminamos con la configuración inicial vamos a los proyectos.
git@userver:~$ mkdir proyectos

# Ahora vamos a crear un proyecto de prueba.
git@userver:~$ mkdir proyectos/testing.git
git@userver:~$ cd proyectos/testing.git/

# Por convención los proyectos terminan en .git "nombre_proyecto.git" .
git@userver:~/proyectos/testing.git$ git --bare init 
# Crea un proyecto vacío.

 

 -En el cliente Monkey D. Luffy-

# Creo la carpeta del proyecto y agrego un archivo "README".
luffy@one-piece:~$ mkdir testing
luffy@one-piece:~$ cd testing/
luffy@one-piece:~/testing$ echo "Inicio del proyecto." >> README

# Inicio el proyecto git, agrego los archivos, primer "commit", agrego remoto y mando al servidor.
luffy@one-piece:~/testing$ git init
luffy@one-piece:~/testing$ git add .
luffy@one-piece:~/testing$ git commit -m "Primer commit"
luffy@one-piece:~/testing$ git remote add origin git@192.168.1.99:~/proyectos/testing.git
luffy@one-piece:~/testing$ git push origin master

 

-En el cliente Alan Tello Oyola (yo)-

# Bajamos el proyecto, agregamos un cambio y mandamos de vuelta.
alan@ax2to:~$ git clone git@192.168.1.99:proyectos/testing.git
alan@ax2to:~$ cd testing/
alan@ax2to:~/testing$ echo "Agregamos un cambio." >> README 
alan@ax2to:~/testing$ git commit -am "agregando un cambio"
alan@ax2to:~/testing$ git push 

 

 -En el cliente Monkey D. Luffy-

 # Actualizamos el proyecto y agregamos ultimo cambio en la prueba.
luffy@one-piece:~/testing$ git pull origin master
luffy@one-piece:~/testing$ echo "Ultimo cambio." >> README 
luffy@one-piece:~/testing$ git commit -am "ultimo cambio"
luffy@one-piece:~/testing$ git push
Y así podríamos continuar hasta que nos cansemos. Podríamos agregar mas clientes, mas proyectos, tenemos nuestra red con un servidor git. Cada nuevo proyecto alguien tiene que entrar al servidor con el usuario git y crear un proyecto git --bare.
También se podría limitar al usuario git a temas relacionas con el mismo git, pero eso en otro momento.
Nota: El archivo README al final quedo así:
Inicio del proyecto.
Agregamos un cambio.
Ultimo cambio.
Actualizacion 1: Habian algunos errores que se originaron cuando puse el script de formato, ya los he corregido.