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