En caso de que esté entrando en esto ahora mismo, acabo de revisarlo hoy y puedo resumir dónde se encuentra esto. Si aún no lo ha intentado, algunos detalles aquí pueden ayudar.
Creo que el enfoque de @Omid Ariyan es la mejor manera. Agregue los scripts de confirmación previa y posterior a la compra. NO olvide nombrarlos exactamente como lo hace Omid y NO olvide hacerlos ejecutables. Si olvida alguno de ellos, no tienen ningún efecto y ejecuta "git commit" una y otra vez preguntándose por qué no sucede nada :) Además, si corta y pega fuera del navegador web, tenga cuidado de que las comillas y las marcas de verificación no sean alterado.
Si ejecuta el script de confirmación previa una vez (ejecutando una confirmación de git), se creará el archivo .permissions. Puede agregarlo al repositorio y creo que no es necesario agregarlo una y otra vez al final del script de confirmación previa. Pero no duele, creo (espero).
Hay algunos pequeños problemas sobre el nombre del directorio y la existencia de espacios en los nombres de los archivos en los scripts de Omid. Los espacios eran un problema aquí y tuve algunos problemas con la solución IFS. Para que conste, este script de confirmación previa funcionó correctamente para mí:
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
# Clear the permissions database file
> $DATABASE
echo -n "Backing-up file permissions..."
IFSold=$IFS
IFS=$'\n'
for FILE in `git ls-files`
do
# Save the permissions of all the files in the index
echo $FILE";"`stat -c "%a;%U;%G" $FILE` >> $DATABASE
done
IFS=${IFSold}
# Add the permissions database file to the index
git add $DATABASE
echo "OK"
Ahora bien, ¿qué sacamos de esto?
El archivo .permissions está en el nivel superior del repositorio de git. Tiene una línea por archivo, aquí está la parte superior de mi ejemplo:
$ cat .permissions
.gitignore;660;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.doc;664;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.pdf;664;pauljohn;pauljohn
Como puede ver, tenemos
filepath;perms;owner;group
En los comentarios sobre este enfoque, uno de los carteles se queja de que solo funciona con el mismo nombre de usuario, y eso es técnicamente cierto, pero es muy fácil de solucionar. Tenga en cuenta que el script posterior al pago tiene 2 acciones,
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
Así que solo me quedo con el primero, eso es todo lo que necesito. Mi nombre de usuario en el servidor web es diferente, pero lo más importante es que no puede ejecutar chown a menos que sea root. Sin embargo, puede ejecutar "chgrp". Está bastante claro cómo poner eso en práctica.
En la primera respuesta de esta publicación, la que es más ampliamente aceptada, la sugerencia es usar git-cache-meta, un script que está haciendo el mismo trabajo que los scripts de pre / post hook aquí (analizando el resultado de git ls-files
) . Estos scripts son más fáciles de entender para mí, el código git-cache-meta es bastante más elaborado. Es posible mantener git-cache-meta en la ruta y escribir scripts de pre-confirmación y post-pago que lo usarían.
Los espacios en los nombres de los archivos son un problema con los dos scripts de Omid. En la secuencia de comandos posterior al pago, sabrá que tiene los espacios en los nombres de los archivos si ve errores como este
$ git checkout -- upload.sh
Restoring file permissions...chmod: cannot access '04.StartingValuesInLISREL/Open': No such file or directory
chmod: cannot access 'Notebook.onetoc2': No such file or directory
chown: cannot access '04.StartingValuesInLISREL/Open': No such file or directory
chown: cannot access 'Notebook.onetoc2': No such file or directory
Estoy buscando soluciones para eso. Aquí hay algo que parece funcionar, pero solo lo he probado en un caso
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
echo -n "Restoring file permissions..."
IFSold=${IFS}
IFS=$
while read -r LINE || [[ -n "$LINE" ]];
do
FILE=`echo $LINE | cut -d ";" -f 1`
PERMISSIONS=`echo $LINE | cut -d ";" -f 2`
USER=`echo $LINE | cut -d ";" -f 3`
GROUP=`echo $LINE | cut -d ";" -f 4`
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
done < $DATABASE
IFS=${IFSold}
echo "OK"
exit 0
Dado que la información de permisos es una línea a la vez, configuro IFS en $, por lo que solo los saltos de línea se ven como cosas nuevas.
¡Leí que es MUY IMPORTANTE volver a configurar la variable de entorno IFS como estaba! Puede ver por qué una sesión de shell puede salir mal si deja $ como único separador.