start sch repositorio que how create git permissions umask

sch - Git cambio predeterminado umask cuando actualice el archivo



que es un repositorio git (4)

Acabo de solucionar este problema al buscar un repositorio en un directorio de inicio montado a través de NFS en Ubuntu 14.04 (Trusty) utilizando el kernel de Linux con versión 4.x de Xenial. Git clone a un directorio local estaba bien. Aún más extraño: un segundo servidor Ubuntu 14.04 no presentó el mismo problema en el mismo directorio montado.

Después de mucho hurgar, pude ver usando strace que git llamó a la llamada al sistema open () para crear cada archivo con las opciones O_CREAT, O_WRONLY y O_EXCL y un modo de 0666, pero luego el siguiente syscal fue un fstat () contra El archivo y me dijo que era el modo 0700. En mi caso el problema solo afectó a ciertos archivos en el repositorio. A pesar de que ''git ls-index'' muestra el modo 0644 para la mayoría de los archivos, algunos de ellos se crearon correctamente y otros no; aunque siempre fueron los mismos archivos los que tenían permisos de clonación incorrectos.

Noté que había una diferencia en la versión de Kernel entre los dos sistemas y luego descubrí el siguiente error: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1654288

Actualizar el kernel a 4.4.0-98 (de 4.4.0-59) solucionó esto para mí. Revisé algunos hosts que todavía usaban la versión 3.x del Kernel de Linux y estos no tenían problemas.

Tengo un problema con Git. Busqué una solución en Google y en StackOverflow pero nada ayuda.

El problema es que cada vez que git actualiza algún archivo en el directorio de trabajo (cuando pago sucursales o fusiono una sucursal, etc.), los permisos de los archivos se modifican de manera que se agrega el indicador "se puede escribir en el grupo". Y mi apache muestra "Error 500" para el archivo si se puede escribir en grupo.

Ejemplo: tengo un archivo index.php. Los permisos son "-rwxr-xr-x". La rama actual (activa) es maestra. Este archivo fue cambiado en la rama "desarrollar". Ejecuto "git checkout develop" y el archivo index.php obtiene los permisos "-rwxrwxr-x" (se puede escribir en el grupo). Y mi sitio deja de funcionar. Como apache no permite esta marca en archivos php (no sé por qué, pero no puedo cambiar esto).

Cada vez que ejecuto "git checkout develop" necesito ejecutar también "chmod gw index.php". No me gusta ejecutar dos comandos (ya veces me olvido de ejecutar esto y mi sitio no funciona).

¿Qué puedo hacer para resolver este problema? Creo que esto es algo relacionado con umask. Hice algunos trucos que encontré en la web, pero nada funciona.

Gracias.


El uso de ganchos para cambiar el modo de archivo después de la verificación está solucionando el problema después de que ya haya ocurrido. Ya tiene un modo de archivo incorrecto en el sistema de archivos al ejecutar el enlace. Si llega una solicitud solo entre la verificación y la ejecución del enlace, el servidor responderá con el error 500. Pero usted puede estar interesado en esta solución de todos modos.

Necesita un post-checkout ejecute chmod gw en todos los archivos necesarios. El gancho es .git/hooks/post-checkout , debe ser ejecutable y obtiene el HEAD actual como segundo parámetro ($ 2 en shell). El gancho podría verse así:

#!/bin/bash git ls-files -z --with-tree="$2" | xargs -0 chmod g-w --

Como el gancho no obtiene la lista de archivos desprotegidos, esta puede ser la mejor implementación posible. Cambia el modo de todos los archivos en HEAD actual.


Es un poco peligroso permitir la ejecución de archivos como un binario. De todos modos resolví el problema con umask. Mi script post-receive ve así:

!/bin/sh umask 002 GIT_WORK_TREE=/var/www/site git checkout -f

Por lo tanto, file permission configurados en 664 y los directory permissions establecidos en 775 , lo que me conviene perfectamente.

PS La configuración de umask en un archivo .profile del usuario git no tiene ningún efecto, y no entiendo por qué, por favor comente si sabe por qué sucede esto.


La respuesta rápida es esta función de shell que se colocará en su ~/.profile . Una explicación sigue.

git(){(umask 0022; command git "$@")}

Un umask es propiedad de un proceso. Se hereda del proceso principal y se puede cambiar desde dentro más adelante. El comando para cambiar umask generalmente también se llama umask.

Git no tiene una opción de configuración para configurar su umask, no cambia su umask después de ejecutarse. Tiene que configurar el umask de Git desde el exterior, dejar que se herede del proceso principal (generalmente un shell).

Mmm, parece que te disgusta la idea de que cualquier cosa, excepto git, ha cambiado umask. Así que vamos a cambiarlo justo al ejecutar git .

Cuando un shell ejecuta una línea, toma la primera palabra en la línea e intenta encontrar una función de ese nombre. Solo si no hay ninguno, intenta localizar un comando de ese nombre en PATH . La función que he escrito anteriormente se llama git , por lo tanto, cualquier invocación directa de git ahora la ejecuta en lugar del comando git .

La función ejecuta una subshell, cambia su umask y ejecuta el comando git desde dentro de la subshell. Una vez que Git termina su trabajo, la subshell también sale y la instancia original del shell seguirá teniendo la umask original.

Sin embargo, la función también muestra cómo evitarse. Si llama a git mediante el command git o incluso /usr/bin/git , no se llamará a la función. Para cualquier uso decente esto es lo suficientemente bueno, sin embargo.