Reutiliza GIT_WORK_TREE en el gancho post-recepción a la rm unos pocos files

He usado este 'tutorial' para configurar un entorno DSP: http://toroid.org/ams/git-website-howto (Sí, no tengo una T).

Mi flujo de trabajo es muy fácil:

  1. Desarrollar localmente ( D )
  2. Cometer algunas cosas
  3. Comprometerse más cosas
  4. Push to Staging (y Github) ( S )
  5. Pruebe el nuevo código en etapas
  6. Empuje hacia la producción ( P )

Mi código contiene files CSS que son minificados por mi código y luego guardados en 1 file: all.css . Localmente, he desactivado esa opción, así que no tengo que eliminar all.css manualmente todo el time cada vez que cambio mi CSS. Tanto en etapas como en producción, deben almacenar en caching lo antes posible (por lo tanto, cree all.css partir de los files CSS separados).

El problema es que cada vez que all.css , tengo que eliminar all.css (y all.js – la misma historia exacta) para ver los cambios (y probarlos correctamente).

Del tutorial hice un gancho post-receive que verifica los cambios en una carpeta determinada (donde Apache lee el código).

Mi actual gancho post-receive :

 #!/bin/sh GIT_WORK_TREE=/var/www/www.example.org git checkout -f 

Quiero reutilizar $GIT_WORK_TREE para eliminar dos files dentro de $GIT_WORK_TREE (siendo www/all.css y www/all.js ), pero no puedo … No hay var $ GIT_WORK_TREE en la siguiente línea.

Así que lo cambié a esto, pero no me gusta, especialmente si quiero hacer más en el futuro:

 #!/bin/sh GIT_WORK_TREE=/var/www/www.example.org git checkout -f rm /var/www/www.example.org/www/all.css rm /var/www/www.example.org/www/all.js 

$GIT_WORK_TREE NO se reutiliza de esta manera.

Cosas que he probado que no funcionan:

 GIT_WORK_TREE=/var/www/www.example.org git checkout -f rm $GIT_WORK_TREE/www/all.css rm $GIT_WORK_TREE/www/all.js 

rm: el file no existe, etc. (/www/all.css) ( $GIT_WORK_TREE está vacío)

 GIT_WORK_TREE=/var/www/www.example.org git checkout -f 

fatal: esta operación debe ejecutarse en un tree de trabajo

 GIT_WORK_TREE=/var/www/www.example.org cd $GIT_WORK_TREE git checkout -f 

fatal: No en un repository de git (o cualquier …..)

Creo que mi problema es tanto con cómo funciona Bash como con cómo funciona GIT =)

Hay algunos problemas con los que estás intentando en este momento. Quizás lo mejor sea explicar qué pasa con cada ejemplo que ha probado a su vez:

 GIT_WORK_TREE=/var/www/www.example.org git checkout -f rm $GIT_WORK_TREE/www/all.css rm $GIT_WORK_TREE/www/all.js 

El problema aquí es que si define una variable directamente antes del command, la variable de entorno solo se establece en el entorno del command que está ejecutando; no está establecido en el shell actual. Puedes probar esto fácilmente:

 $ FOO=bar sh -c 'echo $FOO' bar $ echo $FOO $ 

Tu próximo bash fue:

 GIT_WORK_TREE=/var/www/www.example.org git checkout -f 

En este caso, para que la variable se establezca en el entorno de otros commands que invoque en el script, debe exportarlo, por ejemplo, export GIT_WORK_TREE=/var/www/www.example.org lugar de su primer línea.

Tu último bash fue:

 GIT_WORK_TREE=/var/www/www.example.org cd $GIT_WORK_TREE git checkout -f 

Esto tiene el mismo problema que su bash anterior (es decir, que necesita exportar GIT_WORK_TREE ) pero también tiene un problema más sutil. Como describo en esta publicación de blog , GIT_DIR está configurado para . (es decir, el directory actual) en el entorno del script post-receive . Por lo tanto, si cambia el directory a la parte superior del tree de trabajo, GIT_DIR apuntará a ese directory, ¡y no al directory .git ! Un par de buenas reglas GIT_DIR son (a) que solo debe establecer GIT_DIR y GIT_WORK_TREE juntas, y (b) si las establece, debe establecerlas en routes absolutas. Por lo tanto, creo que el siguiente enlace funcionará en su caso:

 #!/bin/sh export GIT_WORK_TREE=/var/www/www.example.org export GIT_DIR=/var/www/www.example.org/.git cd $GIT_WORK_TREE git checkout -f rm www/all.css rm www/all.js 

¿por qué no usar una variable para la ruta?

 #!/bin/sh work_tree=/var/www/www.example.org GIT_WORK_TREE=$work_tree git checkout -f rm $work_tree/www/all.css rm $work_tree/www/all.js 

entonces no necesitas exportar Esto funciona perfecto para mi

 GIT_WORK_TREE=.... export GIT_WORK_TREE git ... rm $GIT_WORK_TREE/... 

debería funcionar y es más seguro (no siempre es necesario exportar las variables de entorno, pero normalmente no daña :))