¿Por qué `rm -rf` se comporta de manera diferente cuando se utiliza en un gancho git post-receive en lugar de shell?

Estoy usando este ejemplo para publicar un website con git post receive hooks .

El gancho prácticamente clona el repository desnudo en un directory temporal, y después de generar el sitio, elimina ese clon git temporal.

#!/bin/sh # clone a repo, generate site etc # done generating site, remove the TMP_GIT_CLONE rm -rf $TMP_GIT_CLONE 

Cuando hago el push, todas las otras tareas están bien, pero no eliminan todos los files.

Obtengo los siguientes errores:

 remote: rm: <TMP_GIT_CLONE>/.git/objects/pack: Directory not empty remote: rm: <TMP_GIT_CLONE>/.git/objects: Directory not emppty 

Usted obtiene la idea

Sin embargo, cuando invoco el script post-receive directamente desde la línea de command, el rm comporta como se esperaba.

¿Por qué?

Nota: He observado el acto de recepción de Post-hook de forma diferente a shell , donde el problema del solicitante tuvo que ver con estar en un repository simple en lugar de un tree de trabajo.

utilizar

 which rm 

para get el path de rm, por ejemplo. / bin / rm

luego reemplázalo con / bin / rm para get otra oportunidad. A veces, ocurre a través de los scripts de inicio de su script de shell.

No sé si alguna vez encontraste una forma de evitar esto, pero tuve exactamente el mismo problema. Descubrí que el directory / git / objects / pack era el que no se estaba vaciando. Sospecho que cualquier process que se use para rastrear files se ejecuta más despacio o de manera diferente cuando estás en ssh o después de recibir.

Las soluciones:

Una forma es eliminar manualmente esos directorys. Este tipo de trabajo funcionó para mí, pero no quería depender de que esa estructura sea la misma. Intenté eliminar solo el directory .git primero. Eso produjo el extraño comportamiento de quejarse de directorys no vacíos pero finalmente vaciarlos.

Un mejor enfoque es evitar los files git innecesarios en primer lugar. Las respuestas a esta pregunta pueden proporcionar alguna información.
Reemplacé la línea 'git clone' por:

 mkdir -p $TMP_GIT_CLONE git archive master --format=tar | tar -x -f - -C $TMP_GIT_CLONE 

Creo que es seguro deshacerse de $ GIT_REPO. Dado que estás en un gancho post-recepción, sabes que estás en el repository que deseas clonar de todos modos.