miércoles, 28 de marzo de 2012

Primeros pasos con Git

Git es básicamente un sistema de control de versiones. Es decir, ayuda a centralizar y administrar los cambios en el código de un proyecto. Lo usan pesos pesados como el mismo kermel de linux... E incluso Microsoft le da soporte en codeplex. Histeria y controversia aparte...

Para esta guía, sería bueno que vieras mi post sobre DNS, que aún no esta escrito.
En tanto porque puede ser más cómodo trabajar con nombres DNS que con direcciones IP

Instalación

Necesitamos git obviamente, y activar su soporte para ssh.
aptitude install apache2 git-core gitweb openssh-server
Sin embargo, puede que el ssh ya lo estés usando desde hace rato. Y el servidor Apache suelo instalarlo desde el principio. Esto puede bastar.
aptitude install git-core  gitweb

Configuración inicial.

Por razones de seguridad, es necesario que crees un usuario con contraseña en el sistema.
useradd git -c "Usuario Git" -m  passwd git
Nota: Por ahora no he podido hacer que este usuario funcione del todo. Mi vergüenza es infinita.
Use el usuario sin privilegio que cree al instalar Debian.

Configurando Apache

Intenté hacerlo más interesante usando Virtual Host para Apache. En resumen, apache en Debian usa dos directorios para guardar la configuración de los Virtual Host: sites-available y  sites-enabled, ambos dentro de /etc/apache/
Mi fichero se llama gitweb y se encuentra en ambos directorios. Puede servir de ejemplo para la configuración de otro VirtualHost
su root
cd /etc/apache2/
cp sites-available/{default,gitweb}

cat >gitweb <<EOF
<VirtualHost *:80>
ServerName git.xibalba.com
ServerAdmin webmaster@mail
DocumentRoot /usr/share/gitweb
<Directory /usr/share/gitweb>
Allow from all
AllowOverride none
Order allow,deny
<Files gitweb.cgi>
Options FollowSymLinks +ExecCGI
AddHandler cgi-script .cgi
</Files>
</Directory>
#DirectoryIndex /usr/share/gitweb/gitweb.cgi
SetEnv GITWEB_CONFIG /etc/gitweb.conf
ErrorLog ${APACHE_LOG_DIR}/error.log 
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
EOF

cp sites-available/gitweb sites-enabled/
service apache2 reload
Esto es lo que ves cuando apuntas a la dirección especificada en la configuración
Tengo otro post que aún no he escrito donde explico un poco más como funciona Virtual host. Existen otras combinaciones, para el caso esta sirve.
Debes hacer una entrada en el DNS que apunte hacia este host. Sí, la puedes ver en el post que aún no he escrito pero te adelanto que es sobre usar Webmin un poco.

Configuración de Git en el servidor.

De ahora en adelante usaremos el usuario que hemos creado por seguridad.
su- git
Encendemos el servicio
git daemon --base-path=/var/cache/git --detach --syslog --export-all
Nos movemos un poco
cd /var/cache/git

Creamos el directorio del repo. El nombre vienen dado por *.git. En este caso se llama
mkdir proyectophp.git
Entremos.
cd proyectophp/git
Iniciamos el repositorio en toda regla
git init
Le damos un poco de personalidad con una pequeña y corta descripción
echo "Este es el nuevo repositorio"> .git/description
Configuramos el usuario que va a mostrarse en todos los log y en la interfaz web.
git config --global user.name "Alexander Ortíz"
git config --global user.mail "vtacius@mail.com"

Este es nuestro proyecto. Vacío por ahora
Lo que sigue es la forma más básica de trabajar con los ficheros. 
Creamos el primer archivo. Usualmente un README es necesario en cualquier proyecto. Excusa al menos.
vim README
Agregamos el fichero.
git add README
Haces el envío de este a la copia del repositorio que tenemos en nuestro repo (En este caso el servidor)
git commit -a -m "Este es el primer envío de Administrador"
Acá se encuentra ya nuestro primer envío

Configuración de Git en el cliente. 

La siguiente es una de las tantas formas de exportar un repo. Hay bastante documentación al respecto, a veces quisiera tener la paciencia de leerla toda. Básicamente esto es la configuración de los clientes.

git clone \
 vtacius@git.xibalba.com:/var/cache/git/proyectophp.git proyectophp
cd proyectophp
Te darás cuenta que el archivo README esta en el directorio. Esa es la magia de Git

Configuras algunos aspectos, útiles para saber quién es realmente quién envía cada cambio y cosa
 
git config --global user.name "Anibal Barca"
git config --global user.mail "aníbal@mail.com"

Digamos que tu quieres hacer un aporte serio al proyecto.

 
vim index.php
git add index.php
git commit -a -m "Este es el prímer envío de Aníbal Barca"
git push
Pero no funciona. Te tira un mensaje en Inglés de la siguiente forma:
  remote: error: refusing to update checked out branch: refs/heads/master
  remote: error: By default, updating the current branch in a non-bare repository
  remote: error: is denied, because it will make the index and work tree inconsistent
  remote: error: with what you pushed, and will require 'git reset --hard' to match
  remote: error: the work tree to HEAD.
  remote: error: 
  remote: error: You can set 'receive.denyCurrentBranch' configuration variable t
  remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
  remote: error: its current branch; however, this is not recommended unless you
  remote: error: arranged to update its work tree to match what you pushed in some
  remote: error: other way.
  remote: error: 
  remote: error: To squelch this message and still keep the default behaviour, set
  remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
  To vtacius@git.xibalba.com:/var/cache/git/persona.git
  ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'vtacius@git.xibalba.com:/var/cache/git/persona.git'

Yo y mi deficiente inglés llegamos a la conclusión que esto es lo que quería:
Ejecutas en el servidor.

git config receive.denyCurrentBranch warn
De ahora en adelante, cada vez que algunos de los clientes envíe algo, debe ejecutarse lo siguiente en el servidor
git reset --hard
Esta es la prueba que todo valió la pena
Por ahora creo que me reservo otra entrada para que sigamos aprendiendo sobre esta onda. Al menos me ha para
Agradezco a Casidiablo.net y Pixhero, porque mi posts es casi una copia descarada de ambos post 

No hay comentarios:

Publicar un comentario en la entrada

Otros apuntes interesantes

Otros apuntes interesantes