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