sábado, 8 de marzo de 2014

Cómo Crear un Repositorio de GIT Compartido en Debian


Git es un sistema distribuido de control de revisiones.

Vamos a crear un repositorio remoto compartido de git y le añadiremos la siguiente funcionalidad:

- Acceso de lectura y escritura usando el protocolo ssh.
- Acceso anónimo de sólo lectura vía git-daemon.
- Navegar por los repositorios de git vía web.
- Mandar notificaciones por email cuando el usuario realiza un commit.


Este artículo muestra cómo configurar un repositorio de Git en una distribución Debian (Sid).


Crear el repositorio en la máquina remota


Primero vamos a configurar la máquina remota donde instalaremos el repositorio de git.


Creamos el directorio donde colocaremos el repositorio de git:
$ mkdir /gitrepo

Instalamos git
$ sudo aptitude install git

Todos los usuarios capaces de leer y escribir en el repositorio deben pertenecer al grupo gitgroup:
$ sudo groupadd gitgroup
$ sudo chgrp -R gitgroup /gitrepo
$ sudo chmod g+w /gitrepo

Directorio "home" genérico para los usuarios pertenecientes al grupo gitgroup:
$ sudo mkdir /home/gitgroup
$ sudo chgrp -R gitgroup /home/gitgroup


Añadimos nuestro usuario actual al grupo gitgroup.
$ sudo adduser mi_usuario gitgroup
Los cambios se harán efectivos después de volverse a loguear.
$ groups
mi_usuario sudo gitgroup


Creamos ahora un repositorio git vacío.
$ cd /gitrepo
$ git init --bare --shared=0664 my_git_project
Initialized empty shared Git repository in /gitrepo/bar/

NOTA:
0664: el usuario "otro" tiene permisos de sólo lectura.
0660: el usuario "otro" no tiene permisos.

$ chgrp -R gitgroup my_git_project

La opción --shared hace que los directorios, los nuevos ficheros que se creen, etc, tengan los permisos adecuados.

Ahora tenemos un repositorio vacío donde podemos subir nuestros nuevos commits, o algún repositorio preexistente.


Acceso de lectura y escritura


Para permitir acceso de lectura y escritura empleamos el servidor de ssh.
El servidor ssh se encarga de la autentificación, y si es correcta, permite al usuario acceder al contenido del repositorio y ejecutar comandos de git.


Instalar el servidor ssh en la máquina remota:
$ sudo aptitude install openssh-server


Creamos algunos usuarios restringidos p.ej: "user_git" que sólo podrán ejecutar comandos git:
$ sudo adduser --shell /usr/bin/git-shell --home /home/gitgroup --ingroup gitgroup --disabled-login user_git
$ sudo passwd user_git
$ sudo adduser user_git gitgroup


Después de configurar correctamente el servidor ssh ya podemos clonar el repositorio desde "fuera":

Éste es el formato general de una dirección de ssh: ssh://[user@]host.xz[:port]/path/to/repo.git/

$ git clone ssh://user_git@my_computer/gitrepo/my_git_project
Cloning into 'my_git_project'...
user_git@myComputer's password:
warning: You appear to have cloned an empty repository.



Si ya tenemos un repositorio preexistente en nuestra máquina local, podemos subirlo al repositorio remoto:
Local_box$ cd repo
$ git remote add remote_repo ssh://user_git/gitrepo/bar
$ git push remote_repo master:master

Esto significa que hemos creado una configuracion remota llamada "remote_repo",
entonces subimos el contenido de la rama master del repositorio local a la rama master del repositorio remoto.


Acceso de sólo lectura


Proporcionamos acceso anónimo de sólo lectura a nuestro repositorio utilizando git-daemon

Instalamos git-daemon:
Git-daemon ya viene instalado con el paquete git. No necesitamos por tanto instalar más paquetes.
$ dpkg -S /usr/lib/git-core/git-daemon
git: /usr/lib/git-core/git-daemon



Llamaremos al git-daemon mediante el demonio xinetd.
$ sudo aptitude install xinetd

Configuramos xinetd para el demonio git:
$ sudo nano /etc/xinetd.d/git

service git
{
        disable         = no 
        socket_type     = stream
        wait            = no
        user            = nobody
        group           = gitgroup
        server          = /usr/lib/git-core/git-daemon
        server_args     = --reuseaddr --syslog --inetd --verbose
        log_on_failure  += USERID
}

Reiniciamos el servicio xinetd:
$ sudo service xinetd restart

Proporcionamos acceso para los usuarios anónimos:
$ cd /gitrepo/my_git_project
$ touch git-daemon-export-ok

En la máquina local podemos ahora clonarlo:
$ git clone git://REMOTE_IP/gitrepo/my_git_project my_git_project


Navegar por el repositorio via web


Para navegar via web por el repositorio git vamos a usar la herramienta gitweb.

Instalamos gitweb:
$ sudo aptitude install gitweb # Instala también apache como una dependencia.
$ sudo aptitude install libapache2-mod-perl2 # mode perl de apache para ejecuar los scripts cgi.


Configuramos apache:

Puedes añadir ésto a /etc/apache2.conf o donde convenga:

# Configuración para ejecutar scripts perl cgi:
   <Files ~ "\.(pl|cgi)$">
    SetHandler perl-script
    PerlResponseHandler ModPerl::PerlRun
    Options +ExecCGI
    PerlSendHeader On
    </Files>

# Configuración para crear un host virtual
<VirtualHost *:80>

  DocumentRoot /var/www

  Alias /gitrepo /usr/share/gitweb

  SetEnv  GITWEB_CONFIG  /etc/gitweb.conf

  ServerName your.computer.name

  <Directory /var/www/git>
    Allow from all
    AllowOverride all
    Order allow,deny
    Options +ExecCGI
    AddHandler cgi-script .cgi
    DirectoryIndex gitweb.cgi
  </Directory>
</VirtualHost>

Configuramos gitweb:
$ sudo nano /etc/gitweb.conf

# path to git projects (.git)
$projectroot = "/gitrepo";   # lugar donde colocamos nuestros proyectos de git.
$home_link_str = "Gitrepo";  # Muestra ésto como "base" de nuestros proyectos en el navegador.

# Muestra estas direcciones para clonar los proyectos de git.
our @git_base_url_list = qw(git://your_remote_IP/gitrepo
                            ssh://your_remote_IP/gitrepo);
$site_name = "My Git Repository"; # Page name.
$export_ok = "git-daemon-export-ok";  # Igual que para hacerlos visibles con git-daemon.
$feature{'blame'}{'default'} = [1];


Configurar la descripción del proyecto de git.

NOTA: No se debe configurar la Description como una variable de git a gitweb no la detectará.

$ cd /gitrepo/my_git_project
$ echo "Mi primer proyecto en este repositorio" > description


Configuramos el dueño del proyecto:
$ git config gitweb.owner "User name <user@email.address>"


Configuramos el usuario del servidor web para garantizarle permisos para acceder al directorio gitrepo:
$ sudo adduser www-data gitgroup
NOTA: Como www-data tiene acceso de escritura por gitgroup, el directorio DocumentRoot no debería ser el mismo que /var/www/git.
$ sudo service apache2 restart


Ahora podemos abrir http://tu_IP_remota/gitrepo en nuestro navegador y observar la lista de nuestros proyectos.

Seleciona uno de ellos y entra en el sumario. Puedes comprobar los commits, etc.



Mandar un email cuando el usuario envía un commit


Mandar un email es una funcionalidad útil en un proyecto compartido donde varios usuario pueden realizar commits.


Necesitaremo un hook que viene con el paquete git:
$ dpkg -S /usr/share/git-core/contrib/hooks/post-receive-email
git: /usr/share/git-core/contrib/hooks/post-receive-email



Ahora vamos al proyecto git y configuramos los hooks indicándole el adecuado hook post-receive-email.
$ cd /gitrepo/my_git_project/hooks
$ cp /usr/share/git-core/contrib/hooks/post-receive-email post-receive
$ chmod a+x post-receive

Añadimos los usuarios que serán notificados via email:
$ git config hooks.mailinglist "foo@bar.com,baz@bar.net"


Configuramos el contenido del mensaje de email mediante la variable de git: hooks.showrev

Ésta primera, muestra menos información que la configuración que sigue:
$ git config hooks.showrev "git show -C %s; echo"

en ésta: adáptala a tu sistema. p.ej: IP_de_tu_repositorio y my_git_project
$ git config hooks.showrev "t=%s; printf 'http://IP_de_tu_repositorio/gitrepo/?p=my_git_project;a=commitdiff;h=%%s' \$t; echo;echo; git show -C \$t; echo"


El email se cortará después de 100 líneas:
$ git config hooks.emailmaxlines 100


NOTA: sendmail o el demonio de email que sea debe estar correctamente configurado y ejecutándose
$ sudo aptitude install sendmail
$ sudo service sendmail start


REFERENCIA


$ man git-daemon

Compartir un repositorio git entre varios usuarios:
http://serverfault.com/questions/26954/how-do-i-share-a-git-repository-with-multiple-users-on-a-machine

Mandar un email cuando un usuario realiza un commit:
http://stackoverflow.com/questions/552360/git-push-email-notification
http://git.kernel.org/cgit/git/git.git/tree/contrib/hooks/post-receive-email?id=HEAD

Instalar y configurar gitweb:
https://www.kernel.org/pub/software/scm/git/docs/gitweb.html
https://www.kernel.org/pub/software/scm/git/docs/gitweb.conf.html
http://gofedora.com/how-to-install-configure-gitweb/

Configurar los scripts perl cgi en apache2:
http://stackoverflow.com/questions/560749/how-do-i-configure-apache2-to-run-perl-cgi-scripts


Traducido de:


How to Create a shared Git Repository in Debian (ssh, git-daemon, gitweb)


puede que también le interese:


GIT : Guía Rápida : Chuleta

No hay comentarios:

Publicar un comentario