2011-03-10 12 views
13

Usamos un repositorio git alojado en una ubicación remota, y se comparte. Queremos que el repositorio sea usuario & legible por grupo & grabable, pero no tiene permisos para otros. El repositorio remoto es propiedad de un usuario diferente (digamos rUser). Establecí core.sharedRepository en 0660 en mi repositorio local, así como en el repositorio remoto. Además, mi umask es 0027. Entonces, cada vez que creo un archivo nuevo, no tiene permisos para otro.Hacer que git push respete los permisos?

A pesar de todo, por alguna razón cada vez que presiono un cambio en el repositorio remoto, crea algunos objetos nuevos en el directorio repo.git/objects/ con permisos -r--r--r--. Lo que es aún más raro es que me hace (en lugar del usuario remoto) el propietario de los directorios/archivos. ¿Tienes idea de lo que está pasando?

Intenté encontrar una respuesta revisando varias preguntas aparentemente relacionadas en stackoverflow, pero no pude encontrar nada.

+0

¿Cómo está accediendo al repositorio remoto? Parece que podría estar utilizando un método basado en SSH (URL del repositorio 'host: path' o' ssh: // host/path'). Si está utilizando un sistema de archivos de red en su lugar, podría estar complicando las cosas. –

+0

Estoy accediendo usando ssh, y el sistema de archivos remoto es en realidad un sistema de archivos NFS (no estoy seguro de por qué el sistema de archivos afectaría algo aquí). – user10

Respuesta

13

Nota: Supongo que está utilizando un mecanismo de acceso basado en SSH con cada usuario que inicia sesión en el servidor como su propio usuario (es decir, no tiene múltiples usuarios que inician sesión en una sola cuenta para acceder al repositorio). Si esta suposición no es cierta, entonces la siguiente respuesta puede no ser del todo útil.


El ajuste core.sharedrepository de su repositorio personal y la máscara de usuario que se utiliza para acceder a ella son irrelevantes para la propiedad y los permisos se utiliza en un repositorio remoto.

Configuración core.sharedrepository a 0660 en el repositorio remoto es la manera correcta de obtener lo que usted dice que quiere. El umask del usuario que accede desde el lado remoto también es irrelevante porque Git anulará la máscara cuando vea un valor 0xxx para core.sharedrepository. Debe asegurarse de que todos los archivos y directorios pertenezcan a su grupo común y que los permisos sean correctos (2770 para todos los directorios (o solo 770 para sistemas BSD-ish); 440 para archivos de objects/?? y /objects/pack/; 660 para otros archivos).

Es normal que un archivo nuevo sea propiedad del usuario que lo creó. En sistemas que no son BSD, necesita el bit setgid (el bit 2000) en los directorios para hacer que las nuevas entradas hereden el propietario del grupo de su directorio padre. El usuario propietario rara vez se hereda (FreeBSD puede configurarse para hacerlo con el bit de setuid, pero esto no se usa en configuraciones normales). Por lo tanto, todos los archivos y directorios deben tener el mismo propietario de grupo común, pero cada escritura en el repositorio (por ejemplo, inserción) dejará algunos archivos y/o directorios que son propiedad del usuario (es decir, no es necesario que un usuario (su rUser?) sea el propietario de todos los archivos y directorios, cualquier usuario que necesite acceder al repositorio debe ser miembro del grupo común).

Cada usuario tendrá, obviamente, fácil de poseer todos los archivos/directorios que crean, sino que será la mayoría de archivos también por el usuario propia que modificar debido a Git utiliza “reescrituras atómicas” (se escribe el nuevo contenido a un nuevo archivo separado en el mismo directorio, y luego lo renombra sobre el archivo original).

Quizás haya un error en la forma en que Git anula la umask en busca de nuevos archivos. ¿Qué archivos obtienen exactamente permisos demasiado amplios? ¿Qué versión de Git estás en el extremo remoto para acceder en el repositorio? ¿Qué sistema operativo está ejecutando en el extremo remoto?

No he podido reproducir este problema con Git 1.7.4.1 con dos usuarios y un grupo común en mi máquina Unixy.

Puede intentar simplificar un poco el escenario. Intente presionar al repositorio remoto directamente desde el servidor mismo (es decir, haga un clon local y empuje a una rama desechable). Hacer el acceso solo local hace que sea más fácil verificar sus suposiciones (umask; uids; gids; usuario, y propiedad del grupo, y permisos de archivos y directorios antes y después del envío) que cuando tiene un medio de transporte en el medio (Transportes propios basados ​​en SSH de Git, o un sistema de archivos de red que podría no mapear ids y permisos con total fidelidad).

+0

Gracias por su respuesta Chris. Sin embargo, para mí, una cosa muy simple funcionó. Eliminé mi copia personal del repositorio y revisé una nueva copia. Y ahora las cosas funcionan como deberían, es decir, git respeta todos los permisos. Estoy usando la versión 1.7.2.2 de git. – user10

+1

Una nota con respecto a --compartida: NO funciona como lo hace umask, donde está restando permisos, en su lugar está especificando los permisos que establecerá. --shared = 0077 significa que el propietario no puede acceder a él, pero el grupo y el mundo pueden hacerlo. (Rechazará esta opción), mientras que --shared = 0700 significa que solo el propietario puede acceder a ella. –

-2

Lo invito encarecidamente a que use Gitolite, que es una herramienta realmente eficiente para administrar el acceso de control en los repositorios de git.