GIT: Git en el Servidor

Los Protocolos

  • Git puede usar cuatro protocolos principales para transferir datos: Local, HTTP, Secure Shell (SSH) y Git.

Local Protocol

  • Se utiliza habitualmente cuando todos los miembros del equipo tienen acceso a un mismo sistema de archivos, como por ejemplo un punto de montaje NFS, o en el caso menos frecuente de que todos se conectan al mismo computador. Aunque este último caso no es precisamente el ideal, ya que todas las instancias del repositorio estarían en la misma máquina; aumentando las posibilidades de una pérdida catastrófica.
  • Para clonar un repositorio local, puedes usar algo como:
git clone /opt/git/project.git
o
git clone file:///opt/git/project.git
  • Git trabaja ligeramente distinto si indicas file:// de forma explícita al comienzo de la URL. Si escribes simplemente el camino, Git intentará usar enlaces rígidos (hardlinks) o copiar directamente los archivos que necesita. Si escribes con el prefijo file://, Git lanza el proceso que usa habitualmente para transferir datos sobre una red; proceso que suele ser mucho menos eficiente.
  • Para añadir un repositorio local a un proyecto Git existente
git remote add local_proj /opt/git/project.git

Ventajas

  • Los repositorios basados en carpetas y archivos, son más simples y aprovecha de los permisos preexistentes de acceso

Desventajas

  • Dificultad de asceso en distintas ubicaciones

Protocolos HTTP

  • Git puede utilizar el protocolo HTTP de dos maneras. Antes de la versión 1.6.6 de Git, solo había una forma de utilizar el protocolo HTTP y normalmente en sólo lectura. Con la llegada de la versión 1.6.6 se introdujo un nuevo protocolo más inteligente que involucra a Git para negociar la transferencia de datos de una manera similar a como se hace con SSH. En los últimos años, este nuevo protocolo basado en HTTP se ha vuelto muy popular puesto que es más sencillo para el usuario y también más inteligente. Nos referiremos a la nueva versión como el HTTP “Inteligente” y llamaremos a la versión anterior el HTTP “tonto”.

HTTP Inteligente

  • funciona de forma muy similar a los protocolos SSH y Git, pero se ejecutan sobre puertos estándar HTTP/S y pueden utilizar los diferentes mecanismos de autenticación HTTP. Esto significa que puede resultar más fácil para los usuarios, puesto que se pueden identificar mediante usuario y contraseña (usando la autenticación básica de HTTP) en lugar de usar claves SSH.
  • Es, probablemente, la forma más popular de usar Git ahora, puesto que puede configurarse para servir tanto acceso anónimo (como con el protocolo Git) y acceso autenticado para realizar envíos (push), con cifrado similar a como se hace con SSH. En lugar de tener diferentes URL para cada cosa, se puede tener una única URL para todo. Si intentamos subir cambios (push) al repositorio nos pedirá usuario y contraseña, y para accesos de lectura se puede permitir el acceso anónimo o requerir también usuario.
  • De hecho, para servicios como GitHub, la URL que usamos para ver el repositorio en la web (por ejemplo, “https://github.com/schacon/simplegit”) es la misma que usaríamos para clonar y, si tenemos permisos, para enviar cambios.

HTTP Tonto

  • Si el servidor no dispone del protocolo HTTP “Inteligente”, el cliente de Git intentará con el protocolo clásico HTTP que podemos llamar HTTP “Tonto”. Este protocolo espera obtener el repositorio Git a través de un servidor web como si accediera a archivos normales. Lo bonito de este protocolo es la simplicidad para configurarlo. Básicamente, todo lo que tenemos que hacer es poner el repositorio Git bajo el directorio raíz de documentos HTTP y especificar un punto de enganche (hook) de post-update (véase Puntos de enganche en Git). Desde este momento, cualquiera con acceso al servidor web donde se publique el repositorio podrá también clonarlo. Para permitir acceso lectura con HTTP, debes hacer algo similar a lo siguiente:
cd /var/www/htdocs/
git clone --bare /path/to/git_project gitproject.git
cd gitproject.git
mv hooks/post-update.sample hooks/post-update
chmod a+x hooks/post-update

Ventajas

  • Con el inteligente tenemos un único URL para todos los tipos de acceso

Inconvenientes

  • Git sobre HTTP/S puede ser un poco más complejo de configurar comparado con el SSH.

El Procotolo SSH

  • SSH es un protocolo muy habitual para alojar repositorios Git en hostings privados. Esto es así porque el acceso SSH viene habilitado de forma predeterminada en la mayoría de los servidores, y si no es así, es fácil de habilitarlo. Además, SSH es un protocolo de red autenticado, y es sencillo de utilizar.
  • Para clonar un repositorio a través de SSH, puedes indicar una URL ssh:// tal como:
git clone ssh://user@server/project.git
  • También puedes usar la sintaxis estilo scp del protocolo SSH:
git clone user@server:project.git

Ventajas

  • Es fácil de configurar.
  • Es seguro ya que las transferencias son encriptadas y autentificadas.
  • Es eficiente, comprimiendo los datos lo más posible antes de transferirlos.

Desventajas:

  • Imposibilidad para dar acceso anónimo al repositorio

El protocolo Git

  • El protocolo Git es un demonio (daemon) especial, que viene incorporado con Git. Escucha por un puerto dedicado (9418), y nos da un servicio similar al del protocolo SSH; pero sin ningún tipo de autentificación.
  • Para que un repositorio pueda exponerse a través del protocolo Git, tienes que crear en él un archivo git-daemon-export-ok; sin este archivo, el demonio no hará disponible el repositorio.

Ventajas

  • Es el más rápido de todos los disponibles.

Desventajas

  • Es su falta de autentificación