GIT es un sistema de control de versiones (CVS) que sirve para que muchos desarrolladores puedan trabajar a la vez en un mismo proyecto. A diferencia de otros CVS, como subversion, se caracteriza por ser distribuido. Cada repositorio es completo y autónomo, no necesita de un repositorio central. Cualquier clon puede asumir ese papel y “sincronizarse” con otros. Se utiliza en proyectos como el kernel Linux, GNOME, Android, Qt, etc.
Manuales:
Usamos etckeeper para guardar registro de todos los cambios en los archivos de configuración de /etc
El paquete se encarga por si sólo de registrar los cambios cuando instalas nuevo software por apt.
Más información: http://sysadmin.vazqueznanini.com.ar/herramientas/etckeeper
El script /root/bin/crear-repositorio genera un repositorio accesible por SSH en /var/git a partir del directorio local que se le indique.
USO:
crear-repositorio /ruta/directorio/origen nombre-repositorio
NOTAS:
Usando cualquier cuenta de un usuario perteneciente al grupo habitat y con acceso SSH, puede clonarse y realizar cambios sobre cualquiera de los repositorios generados con el citado script.
Como el servidor no atiende en el puerto estándar del SSH, sino que está escuchando en el puerto 3222, hemos de configurar el archivo ~/.ssh/config
Host luna.ee.upm.es
Port 3222
Ya podemos clonar cualquier repositorio definido:
git clone usuario@luna.ee.upm.es:/var/git/nombre-repositorio
Para traernos los cambios que haya podido subir otros colaboradores, sólo tenemos que ingresar en el repositorio clonado y ejecutar:
git pull origin master
Para subir los cambios que hagamos al repositorio origen:
# Si hemos generado nuevos ficheros los agregamos al commit git add . # Actualizamos el repositorio local (commit) git commit -a -m 'mensaje' # Lo subimos al repositorio remoto llamado origin a su rama master git push origin master
#!/bin/bash # http://superuser.com/questions/446137/how-to-setup-git-repo-on-server-with-need-for-working-dir-non-bare # CONFIGURACIÓN: # ------------- PATH_ALMACEN='/var/git' PROPIETARIO='habitat:habitat' # FUNCIONES Y VARIABLES AUXILIARES: # -------------------------------- # Colores COLOR_ROJO="\e[31m" COLOR_VERDE="\e[32m" COLOR_AZUL="\e[36m" COLOR_NORMAL="\e[0m" # INFORMACIÓN DE USO: function uso() { cat << FIN USO: crear-repositorio </path/directorio/origen> <nombre-repositorio> Crea un nuevo repositorio GIT accesible por SSH en ${PATH_ALMACEN}/nombre-repositorio a partir del directorio origen, el cual debe existir. FIN } function error() { echo -e "${COLOR_ROJO}ERROR: ${COLOR_NORMAL} $*" exit 1 } function ruta_absoluta() { echo $(cd $* > /dev/null 2>&1; if [ $? -eq 0 ]; then pwd -P; fi) } # VALIDACIONES: # ------------ # Comprobamos argumentos: ORIGEN=$(echo $(ruta_absoluta $1) | sed -e 's/\/$//') DESTINO=${PATH_ALMACEN}/$2 if [ $# -ne 2 ]; then error "Número de argumentos inválido. $(uso)" fi if [ ! -d $ORIGEN ]; then error "$ORIGEN no es un directorio. $(uso)" fi if [ -d $DESTINO ]; then error "Ya existe un repositorio con el nombre $DESTINO. $(uso)" fi mkdir -p "$DESTINO" cp -av $ORIGEN/. "$DESTINO" #chown habitat:habitat $DESTINO cd "$DESTINO" git init git add . git commit -a -m 'versión inicial' git config --bool core.bare true rm -rf $DESTINO/* mv $DESTINO/.git/* $DESTINO/ rm -rf $DESTINO/.git chown -R ${PROPIETARIO} $DESTINO chmod -R g+w $DESTINO cat << 'FIN' > $DESTINO/hooks/post-update #!/bin/sh git update-server-info if dir=$(git config hooks.checkoutTo); then for ref; do if [ "$ref" = "refs/heads/master" ]; then # Must give a path (such as ".") to avoid switching HEAD. git --work-tree="$dir" checkout -f "$ref" -- . fi done fi FIN chmod +x $DESTINO/hooks/post-update git config hooks.checkoutTo $ORIGEN