Instalación de GIT + gitolite en gentoo

Gentoo Linux

Después de usar subversion durante largo tiempo(y no me puedo quejar ya que me ha servido de mucho) se me ha hecho complicado el uso de subversión ultimanente debido a que ahora uso mi laptop para el desarrollo, pero sin embargo sigo usando mi PC como servidor, el problema estaba en que para poder generar un commit necesitaba estar conectado a mi servidor, y usualmente dejaba de desarrollar por que yo hago commits cada vez que cumplo un requisito y eso es como 5 veces al día por lo cual siempre tenia que estar conectado al servidor y por motivos de trabajo no siempre podía estar conectado al servidor.

Según lo que leí en unos posts, el Sistema de Gestor de Versiones git es algo diferente, en vez de tener solo una copia del commit actual en el cliente, se tiene un historial completo de los cambios al código fuente, se puede realizar commits sin necesidad de estar conectado al servidor y después se puede actualizar los cambios al servidor.... que bacán , no?. Así que me decidí a instalar git, o por lo menos probarlo :P.

Descripción de Herramientas:

OpenSSH: Es el servidor ssh que usaremos en nuestro servidor, git requiere una configuración ssh para funcionar.

git: Es el Sistema Gestor de Versiones que instalaremos.

gitolite: Un conjunto de herramientas en línea de comandos que usaremos para generar una especie de servidor central, administración de usuarios, permisos, etc.

Instalación y Configuración de Servidor:

Primero empezaremos instalando OpenSSH, la verdad es que no se necesitan muchos cambios aquí. Para instalar ejecutamos:

emerge openssh

Una vez instalado el servidor ssh, pasamos a configurarlo, lo esencial aquí es habilitar al usuario git para que pueda ingresar al servidor desde ssh.

nano /etc/ssh/sshd_config

y agregamos la línea:

AllowUsers git

iniciamos el servidor ssh y lo agregamos al runlevel:

/etc/init.d/sshd start && rc-update add sshd default

Con los pasos anteriores ya tenemos preparado el servidor SSH y configurado para permitir al usuario git accesar a través de SSH. El usuario git todavía no está configurado, este se creará al instalar gitolite.

Ahora instalaremos git

emerge git

Ahora instalaremos gitolite

emerge gitolite

Gitolite agregará el usuario git, además de que este tendrá como carpeta de usuario a /var/lib/gitolite. Gitolite es un conjunto de scripts y herramientas para el mantenimiento de servidores basados en repositorios git, nosotros no usaremos esto debido que se auto configura el repositorio para el uso de estas herramientas.

Antes de crear un repositorio con gitolite, primero, debemos crear una llave para usarla con ssh para poder usarla en el servidor. Como usuario normal ejecutamos:

ssh-keygen -t rsa

Esto creará una llave pública rsa ubicada en ~/.ssh, ahora copiaremos esa clave a /tmp para poder acceder a ella desde el usuario git.

cp ~/.ssh/id_rsa.pub

Ahora ingresaremos como root, colocaremos un password para el usuario git:

  • passwd git
  • Nueva contraseña:
  • Vuelva a escribir la nueva contraseña:
  • contraseña actualizada correctamente

Accedemos como usuario git:

su git

Verificamos si la carpeta personal es /var/lib/gitolite:

echo $HOME

Deberia darnos la siguiente ruta:

/var/lib/gitolite

Ahora creamos el repositorio git con gitolite:

gl-setup /tmp/id_rsa.pub

Debería darnos (aproximadamente) la siguiente salida:

creating gitolite-admin...
Initialized empty Git repository in /var/lib/gitolite/repositories/gitolite-admin.git/
creating testing...
Initialized empty Git repository in /var/lib/gitolite/repositories/testing.git/
[master (root-commit) e557374] start
 Committer: added by portage for gitolite 
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

If the identity used for this commit is wrong, you can fix it with:

    git commit --amend --author='Your Name '

 2 files changed, 6 insertions(+), 0 deletions(-)
 create mode 100644 conf/gitolite.conf
 create mode 100644 keydir/id_rsa.pub

El comando anterior creará una carpeta llamada repositories en la ruta /var/lib/gitolite/, esta carpeta contiene el repositorio gitolite-admin.git y testing.git. En el repositorio gitolite-admin.git se realiza la configuración de todo el servidor git basado en gitolite.Para terminar la configuración del servidor modificaremos el archivo /etc/conf.d/git-daemon y lo haremos quedar de la siguiente manera:

# conf.d file for git-daemon
#
# Please check man 1 git-daemon for more information about the options
# git-daemon accepts. You MUST edit this to include your repositories you wish
# to serve.
#
# Some of the meaningful options are:
#   --syslog      --- Enables syslog logging
#   --verbose     --- Enables verbose logging
#   --export-all  --- Exports all repositories
#   --port=XXXX   --- Starts in port XXXX instead of 9418
#
GITDAEMON_OPTS="--syslog /var/lib/gitolite/repositories/"

# To run an anonymous git safely, the following user should be able to only
# read your Git repositories. It should not able able to write to anywhere on
# your system, esp. not the repositories.
GIT_USER="git"
GIT_GROUP="git"

Si se fijan detalladamente he cambiado la opción GITDAEMON_OPTS para que apunte a la carpeta repositories de gitolite. Ahora solo agregaremos git-daemon al runlevel y lo iniciamos:

/etc/init.d/git-daemon && rc-update add git-daemon default

Configuración del Cliente y Manejo de Repositorios:

Para poder configurar el servidor, clonaremos el repositorio en el Servidor, pero lo haremos como usuario normal(git debe estar instalado también en el cliente):

git clone git@localhost:/gitolite-admin.git 
Cloning into gitolite-admin...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.

Esto clonará el repositorio en gitolite-admin, este repositorio contiene 2 subcarpetas: conf y keydir. En la subcarpeta conf está el archivo gitolite.config, en este archivo se configuran los nuevos repositorios además de los permisos indicando el nombre de la llave publica que debe estar ubicada en la subcarpeta keydir. Veamos la configuración del archivo gitolite:

repo    gitolite-admin
        RW+     =   id_rsa

repo    testing
        RW+     =   @all

repo    katakuntur
        RW+     =   llullutuqo

He agregado un repositorio nuevo llamado katakuntur(repo katakuntur) y he dado permisos de lectura y escritura a llullutuqo(RW+ = llullutuqo), como yo quiero acceder desde mi laptop crearé una llave pública en mi usuario de la laptop con el siguiente comando:

ssh-keygen -t rsa

Como en el anterior caso, esto me creará una llave pública ssh en ~/.ssh/ llamada id_rsa.pub. La llave pública debe ser ubicada en la subcarpeta keydirs del repositorio clonado gitolite-admin con el nombre de llullutuqo.pub. Una vez hecho los cambios(modificado el archivo gitolite.conf y agregada la llave pública a keydir) procedemos a hacer un commit :

git commit -a -m 'Creando repositorio katakuntur'
git push
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 380 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: Already on 'master'
remote: creating gita...
remote: Initialized empty Git repository in /var/lib/gitolite/repositories/katakuntur.git/
To git@localhost:/gitolite-admin.git
   a292822..5082e5b  master -> master

¡Listo! con esto ya tenemos nuestro nuevo repositorio(en mi caso el repositorio katakuntur.git) para ser usado, ahora simplemente clonamos el nuevo repositorio desde el cliente:

git clone git@192.168.1.23:katakuntur.git
Cloning into katakuntur...
The authenticity of host '192.168.1.23 (192.168.1.225)' can't be established.
ECDSA key fingerprint is 59:ff:c0:3c:7b:06:53:ba:f3:2e:66:09:df:90:f6:a7.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.23' (ECDSA) to the list of known hosts.
warning: You appear to have cloned an empty repository.

Donde la ip 192.168.1.23 es la ip de mi servidor en mi área local, debes cambiar la ip de acuerdo a tus necesidades, en caso de que solo quieras clonar desde la misma pc puedes usar localhost o 127.0.0.1

Sistemas Operativos: 
Tecnologias: