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...

En mi caso, el servidor Git es un Debian 6 virtualizado, sobre Fedora 16. Tengo un pequeño servidor DNS en el Fedora, por lo que no tengo que usar direcciones ip sino que lo manejo todo con nombres.

Lo que haremos es instalar Git en su forma más básica, con una bonita interfaz web que puede servir para algo...Puede ser útil para proyectos en centros de computo, tales como tu casa cuando varios amigos trabajen en una mismo proyecto.

Aunque la instalación se describe para Debian, en Fedora también existen todos estos paquetes, aunque con la usual diferencia de nombres.
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.
No voy a mover los archivos de lugar. Para ser la primera vez induce a errores, ya otra vez haré el intento.
Los archivos de gitweb se encuentran en /usr/share/gitweb y en esa misma raíz esta un cgi en perl que es el que hace todo el trabajo.
Sin embargo y por razones de seguridad, es necesario que crees un usuario con contraseña en el sistema.

useradd git -M -d /var/cache/git/
passwd git



Y usas este usuario

su git



Configurando Apache
Para configurar apache es más cómodo hacerlo como root y cuidar después de los permisos.
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. Queda de la siguiente forma y es posible usarlos de ejemplo para otros sitios.

<VirtualHost *:80>
ServerName git.xibalba.com
ServerAdmin webmaster@localhost
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>



La magia del Virtual Host se corresponde básicamente con la forma en que el cliente resuelve el nombre. git.xibalba.com.
<VirtualHost *:80> indica que va a usar la ip establecida para Apache en el puerto predeterminado. Es posible otras combinaciones, para el caso esta sirve.

El el parámetro ServerName git.xibalba.com el que indica que ante la petición a tal url se responda con tal sitio, especificado en el correspondiente archivo.

Esto lo puedes hacer con DNS. No te compliques mucho en este aspecto y usa webmin, estará bien por el momento.
Configuración de Git en el servidor.

¿Podemos empezar con lo del repo? Pues para empezar necesitamos iniciar el servicio.

git daemon --base-path=/var/cache/git --detach --syslog --export-all



/var/cache/git es el directorio donde se guardan los proyectos git. Se especifica el comando en cuestión.

Nos movemos hasta allí.

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


Creamos el primer archivo. Usualmente un README es necesario en cualquier proyecto. Excusa al menos.

vim README


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"



Lo que sigue es la forma más básica de trabajar con los ficheros.

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 prímer envío de Alexander Ortíz"



Configuración de Git en el cliente. Uno de los tantos.
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.

git clone git@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"



Ahora 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 to
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

git config receive.denyCurrentBranch warn



De ahora en adelante, cada vez que alguien envíe algo, en el server debe ejecutarse lo siguiente

git reset --hard



Esta es la prueba de que todo funciona
Primeros pasos con Git
Luego, si quieres enviar otro fichero desde el servidor sólo ejecuta:

git add fichero
git commit -a -m "Este es otro envío cortesía de la casa"


Si eres un cliente, debes agregar el

git push



Para actualizar tu repositorio con el que tiene el servidor ejecuta

git pull



Y bien, por ahora creo que esto tendrá que ser todo. Esto ya alcanza y funciona para enviar distintos ficheros. Recomiendo que pruebes una y otra vez antes de agregar algo... Y que si consigues hacerlo mejor, avises.

Agradezco a Casidiablo.net y Pixhero, porque mi posts es casi una copia descarada de ambos post