2012-06-27 6 views
18

Estoy usando git para administrar un sitio web en un servidor.Git está cambiando los permisos de mi archivo cuando presiono al servidor

I tienen un repositorio local se muestra a continuación

[email protected]:myapp$ ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o ",k);print}' 
total 16 
755 [email protected] 18 thomas staff 612 Jun 13 15:35 application 
755 [email protected] 11 thomas staff 374 Jun 12 16:25 assets 
644 [email protected] 1 thomas staff 6399 Jun 22 11:45 index.php 
755 [email protected] 10 thomas staff 340 May 14 15:22 system 

Tengo un repositorio desnudo en el servidor que utiliza post-receive para señalar el repositorio delante de Apache. El contenido de las carpetas de public de Apache está por debajo del repositorio desnudo.

[email protected]:/srv/public/myapp# ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf("%0o ",k);print}' 
total 20 
700 drwx------ 15 root root 4096 Jun 27 11:31 application 
700 drwx------ 10 root root 4096 Jun 27 11:31 assets 
600 -rw------- 1 root root 6399 Jun 27 11:31 index.php 
700 drwx------ 8 root root 4096 Jun 27 11:31 system 

Esto está causando caos en mi código en el servidor web.

¿Cómo puedo solucionar esto? Estoy usando gitolita si eso hace alguna diferencia.

servidor git archivo de configuración

[core] 
     repositoryformatversion = 0 
     filemode = true 
     bare = true 
+2

¿Ha comprobado la máscara de usuario para el usuario que se utiliza para crear/srv/repo pública/miaplicacion? ¿Qué hay en la configuración de git? ¿Algo relacionado con el modo archivo cambió allí? – bcelary

+0

He estado jugando con el modo de archivo y lo tenía funcionando en un punto, ahora es "cierto". No estoy seguro de qué es "el desenmascaramiento". Tengo un usuario de git que configuré con gitolite. Actualicé la publicación. – ThomasReggi

+0

Ver [esta pregunta] (http://stackoverflow.com/questions/1071241/how-does-git-handle-folder-permission). – vergenzt

Respuesta

19

This thread post ofrece una muy buena explicación:

Esto es por diseño. Mientras que la estructura de datos git puede almacenar técnicamente bits de modo unix en sus árboles, al principio de la historia de git que cualquier cosa más allá de un simple bit ejecutable terminó siendo más engorroso para los casos de uso normal de git (es decir, personas almacenando código u otros archivos compartidos en un repositorio).

Podríamos agregar una opción de configuración para respetar los modos de archivo, pero generalmente se ha considerado que no valía la pena. Solo resuelve una parte del problema de metadatos generales , ya que omite los nombres o identificadores de propietario y grupo, como , así como metadatos ampliados como ACL.

Si modos son importantes para usted, las correcciones sugeridas son uno de:

  1. utilizar una herramienta como "meta almacén" que se puede llamar desde ganchos Git, y va a guardar y restaurar los permisos de archivos en una archivo que se rastrea en el repositorio. Tenga en cuenta que cuando se utiliza una herramienta de este tipo existe una condición de raza en la protección de archivos (es decir, git creará su archivo como 644, y luego metastore lo corregirá a 600; mientras tanto, alguien podría leer su archivo).

  2. Dependiendo de exactamente lo que está almacenando, puede tener sentido para mantener su repositorio en otro directorio, protegida por permisos y a continuación, utilizar una herramienta separada para desplegar sus archivos desde el repositorio a su ubicación definitiva (por ejemplo, un Makefile u otra herramienta de instalación ).

+4

Como está en la web y necesito permisos persistentes. ¿Puedo simplemente agregar una línea a mi gancho post-recepción que cambia todos los archivos y carpetas en el directorio de trabajo (no el repositorio desnudo) a los permisos correctos, carpetas '755' y archivos' 644'. – ThomasReggi

+2

Si eso satisface sus necesidades, entonces sí. El punto clave es que Git no lo hará por ti. Si desea permisos específicos, deberá hacerlo manualmente. – vergenzt

+1

@ThomasReggi puede configurar 'umask 022' en su script .profile para aplicar 755 y 644 cuando se crean nuevos archivos, como extraer archivos de Git –

Cuestiones relacionadas