Es muy posible que queramos tener un control de usuarios y permisos en nuestro repositorio git centralizado, si por ejemplo, tenemos a varios equipos de varios desarrolladores trabajando cada uno con un repositorio diferente. Afortunadamente, existen varias soluciones a este problema pero yo me he quedado con gitolite, por su facilidad de gestión y sus posibilidades.
NOTA: En este post se irá cambiando del servidor (miServer) a mi PC local (miPC). Se irá comentando a lo largo del post a qué entorno se hace referencia, pero si te pierdes, fíjate en el inicio de cada comando ejecutado (ej: [root@miServer ~] vs [adri@miPC])
Instalación
Añadimos el repositorio EPEL para nuestro servidor con el repositorio central, un CentOS 6:
[root@miServer ~]# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@miServer ~]# rpm -Uvh epel-release-6-8.noarch.rpm
Instalamos git y a posteriori gitolite, que en mi caso, me ha instalado y/o actualizado bastantes paquetes, la mayoría relacionados con perl:
[root@miServer ~]# yum install git gitolite3.noarch
A continuación, crearemos un usuario de sistema, para gitolite, al que en el ejemplo hemos llamado «git», y que será el usuario de sistema con el que interactuarán los usuarios con el repo:
[root@miServer ~]# useradd --system --shell /bin/bash --home /home/git git
Configuración inicial
Para poder configurar gitolite, deberemos dar de alta a un primer usuario, que será el usuario administrador que tendrá permisos sobre el repositorio de configuración de gitolite. En mi caso, será el usuario de mi PC local, «adri». Para ello, deberemos copiar la clave pública del usuario «adri» de mi PC local, a la home del usuario «git» del server. Como el usuario de sistema «git» que hemos creado, no tiene password, no nos permite conectar por SSH, así que dejaremos el .pub en /tmp, como paso intermedio:
[adri@miPC] scp ~/.ssh/id_rsa.pub root@git_server_IP_address:/tmp/git-admin.pub
NOTA: Posteriormente podremos añadir/modificar usuarios con acceso a la administración de gitolite, no te preocupes.
En este punto, estando logueados como root en el servidor, cambiaremos al usuario «git» que hemos creado en el punto anterior, para poder así configurar gitolite:
[root@miServer ~]# su - git
Logueados como «git», pasaremos a inicializar gitolite usando la clave pública que le hemos pasado:
-bash-4.1$ gitolite setup -pk /tmp/git-admin.pub
Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/
Initialized empty Git repository in /home/git/repositories/testing.git/
WARNING: /home/git/.ssh missing; creating a new one
WARNING: /home/git/.ssh/authorized_keys missing; creating a new one
NOTA: Según la versión de gitolite con la que estemos trabajando, se deberá ejecutar «gl-setup /tmp/git-admin.pub» en lugar de «gitolite setup -pk /tmp/git-admin.pub»
Administración de gitolite
Para poder administrar gitolite, como hemos visto en el punto anterior, usaremos la cuenta remota del usuario «adri». En mi PC local, pues, deberemos instalar git si no lo teníamos instalado anteriormente:
[root@miPC]# yum install git.x86_64
Posteriormente, clonaremos el repositorio de administración de gitolite, estando logueados con el usuario «adri», que es el único que tiene acceso al repo mediante certificados:
[Adri@miPC ~]$ mkdir gitoliterepo
[Adri@miPC ~]$ cd gitoliterepo/
[Adri@miPC gitoliterepo]$ git clone git@git_server_IP_address:gitolite-admin
Cloning into 'gitolite-admin'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0
Una vez hecho ésto, tendremos el repositorio de administración clonado en local. Lo primero que haremos ahora, será configurar el nombre y mail de mi usuario local para que se asocie con las operaciones administrativas de gitolite:
[Adri@miPC gitolite-admin]$ git config --global user.name "Adrian Perez"
[Adri@miPC gitolite-admin]$ git config --global user.email "[email protected]"
Gestión de usuarios
En el repositorio gitolite-admin que acabamos de clonar, encontraremos dos carpetas: conf y keydir. Lo que deberemos hacer es dejar dentro del directorio keydir, las claves públicas de los usuarios que quieran trabajar con el repositorio git. Así pues, si el usuario joe nos pasa su clave pública joe.pub, la dejaremos dentro del directorio y posteriormente pushearemos al repositorio del servidor:
[Adri@miPC ~]$ cd ~/gitoliterepo/gitolite-admin
[Adri@miPC gitolite-admin]$ cp ~/joe.pub keydir/
[Adri@miPC gitolite-admin]$ git add keydir/joe.pub
[Adri@miPC gitolite-admin]$ git commit -a -m "New user Joe added"
[Adri@miPC gitolite-admin]$ git push
Con ésto, habremos añadido el usuario con nombre «joe» (es el nombre del fichero .pub, que puedes renombrar como te convenga) al listado de usuarios de Git.
Gestión de permisos y repositorios
Para crear un nuevo repositorio en gitolite, también lo haremos desde el fichero de configuración del repo gitolite-admin.
[Adri@miPC gitolite-admin]$ vi conf/gitolite.conf
Ahí definiremos el nuevo repositorio y quién tiene acceso a él. En el ejemplo, definiremos un nuevo repo llamado «foo» al cual únicamente tiene acceso total (RW+) el usuario joe, creado anteriormente.
repo foo
RW+ = joe
Tras añadirlo, deberemos pushear los cambios, y gitolite se encargará automáticamente de crear un repositorio «bare» vacío en el servidor, listo para ser clonado. NOTA: Se creará un repositorio con el parámetro «bare» cuando se trate de un repositorio compartido.
[Adri@miPC gitolite-admin]$ git add conf/gitolite.conf
[Adri@miPC gitolite-admin]$ git commit -a -m "New repo for Joe"
[Adri@miPC gitolite-admin]$ git push
Desde este momento, Joe ya podrá clonar el repositorio desde su PC local, estando logueado con el usuario «joe» que anteriormente nos dió su clave pública:
[joe@joePC ~]$ git clone git@git_server_IP_address:foo
Ten en cuenta que tras el clonado inicial, al tratarse de un repo vacío creado con «bare», el primer push deberá tener las branches origen y destino, del estilo:
[joe@joePC ~]$ git push origin master
Notas finales: resumen
Como hemos visto, para añadir un nuevo usuario bastará con añadir su clave pública (.pub) al directorio keydir y pushear. El nombre del usuario será el nombre del fichero sin el .pub
Para gestionar los permisos bastará con indicar el tipo de permiso (R, RW, RW+) y el usuario o grupo de usuarios, para cada repositorio, y posteriormente pushear los cambios.
Easy & fast.
Fuentes:
http://gitolite.com/gitolite/setup.html
http://stackoverflow.com/questions/10888300/gitosis-vs-gitolite
Hola. Tengo un problema que cuando agregó un usuario agregando el file .pub respetando el nombre de usuario y creando un nuevo Repo tal cual como se indica en este tutorial… luego pongo la clave privada en el directorio .SSH para que lo tomé git en línea de comando (uso Windows como cliente) me pide password del usuario con el cual quiero hacer el Clone del nuevo Repo…
Ahora estoy pensando… siempre su hago un Clone. Tiene que hacerlo con el user git@Server? O tenes un typo en el tutorial? Gracias
Hola @Luciano,
Gracias por pasarte y comentar.
La verdad que este tutorial está pensado para Linux, sin embargo, deberías poder acceder con tu cliente Windows también.
Te recomendaría mirarte el siguiente enlace referente a la creación y uso de claves SSH en Windows para Git:
http://guides.beanstalkapp.com/version-control/git-on-windows.html#installing-ssh-keys
También te pediría que revisaras si lo que has copiado en el repo es la clave pública o la privada (¡¡¡recuerda que sólo tienes que añadir la pública!!!), mientras que el usuario desde Windows, usará la privada para conectar.
¡Suerte!