2009-10-12 14 views
5

Estoy usando Git incorrecto. Quiero usarlo bienEmpujando un árbol fuente de Git, no solo un repositorio

Esto es lo que tengo:

Por aquí, en mi máquina de desarrollo es un repositorio Git, que se comprometan a prueba en ella.

Por allá, está mi servidor web, el único lugar donde se implementará este código. El servidor web tiene otro repositorio de git al que puedo acceder, a través de SSH, cuando estoy listo para implementar.

Lo que quiero que suceda es tener una vista en el repositorio Git que siempre tiene las últimas versiones de los archivos fuente (en alguna rama o con alguna etiqueta).

Lo que PODRÍA hacer es crear otro repositorio git (no puro) en el servidor web, y hacer una extracción manual después de cada inserción, pero esperaba evitar tener que iniciar sesión en el servidor web cada vez que hago un git push.

¿Hay alguna manera de hacer un "empuje remoto al servidor web y actualizar sus archivos desprotegidos, si prometo que no edité ningún archivo en el servidor web"?

¿O simplemente lo estoy haciendo tan mal que quieres abofetearme? :-)

Respuesta

7

por lo general se crea un repositorio no-desnudo con un .git archivo/ganchos/post-recepción que contiene

#!/bin/sh 
cd .. 
env -i git reset --hard 

Este archivo debe ser ejecutable y una rama debe estar desprotegida.

Luego, cada vez que ingresa a ese repositorio, el árbol de trabajo se reiniciará a la última versión de la rama actual. Cualquier cambio local se sobrescribirá (pero los archivos sin seguimiento no se eliminarán).

Git ahora muestra una advertencia cuando presiona una rama desprotegida (y la rechazará en futuras versiones). Para evitar esto se puede establecer esta configuración en el repositorio remoto:

git config receive.denyCurrentBranch ignore 

Usted puede trabajar en este repositorio, pero hay que confirmar los cambios antes de que cualquier empuje se realiza a la misma.

me encontré con la punta allí: http://debuggable.com/posts/git-tip-auto-update-working-tree-via-post-receive-hook:49551efe-6414-4e86-aec6-544f4834cda3

7

El hooks podría ser lo que estás buscando.

Crea un gancho post-recepción. Y se ejecutará en el servidor después de cada impulso que estés haciendo. Entonces haces un tirón en el segundo repositorio desnudo y que siempre habrá al día :)

1

utilizo para este tipo de cosas un repositorio desnudo (dentro de una cuenta de usuario) y un repositorio compartido que es la raíz de la web.
El repositorio desnudo tiene un gancho posterior a la actualización para extraer la raíz web, por lo que después de presionar al repositorio se extraerá la raíz web.

Para tener acceso de lectura/escritura desde el servidor web, mi usuario de git también está en el grupo www-data y el directorio raíz web fue chmod ug + rwx, g + s para que los nuevos archivos creados sean propiedad del grupo.Umask se asegura de que el grupo tenga acceso de lectura/escritura porque Git usa la umask predeterminada que normalmente es 0022 (la documentación dice algo acerca de usar umask propio en la configuración pero esto nunca funcionó para mí)

#!/bin/bash 
# post-update hook 

WEB_DIR="/var/www/myweb" 
pushd $WEB_DIR > /dev/null 
export GIT_DIR="$WEB_DIR/.git" 
umask 0007 
git pull 
popd > /dev/null 
Cuestiones relacionadas