git

Repositorios GIT a través de SSH

¿Qué es GIT?

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:

Git en el servidor CF+S

etckeeper

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

Crear un repositorio git de origen

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:

  • El directorio origen se queda como una copia del último estado del repositorio pero no contiene el repositorio propiamente dicho. Por lo que no se debe modificar directamente esta copia de trabajo, ha de hacerse un push al repositorio.
  • Los repositorios desnudos de origen se crean en realidad en /var/git/nombre-repositorio.
  • Cada vez que alguien haga un cambio (push) se actualiza automáticamente el directorio origen.

Clonar un repositorio remoto en un cliente

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

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

Script /root/bin/crear-repositorio

/root/bin/crear-repositorio
#!/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
git.txt · Última modificación: 2013/09/02 16:52 por root