¿Cómo otorgar lectura / escritura a un usuario específico en cualquier subdirectorio existente o futuro de un directorio dado?

8

Alojo mi propio repositorio git en un VPS. Digamos que mi usuario es John.

Estoy usando el protocolo ssh para acceder a mi repositorio git, por lo que mi url es algo así ssh://[email protected]/path/to/git/myrepo/.

Root es el dueño de todo lo que está debajo /path/to/git

Estoy tratando de dar acceso de lectura / escritura a John a todo lo que está debajo /path/to/git/myrepo

He intentado tanto chmody setfaclal control de acceso, pero ambos fallar de la misma manera: se aplican los derechos de forma recursiva (con las opciones correctas) a todos los subdirectorios actuales existentes de /path/to/git/myrepo, pero tan pronto como se crea un nuevo directorio, mi usuario no puede escribir en el nuevo directorio

Sé que hay ganchos en git que me permitirían volver a aplicar los derechos después de cada confirmación, pero estoy empezando a pensar que voy por el camino equivocado porque esto parece demasiado complicado para un propósito muy básico.

P : ¿Cómo debo establecer mi derecho para dar acceso a rw a john a cualquier cosa debajo /path/to/git/myrepoy hacer que sea resistente al cambio de estructura de árbol?

P2 : Si debo dar un paso atrás, cambiar el enfoque general, por favor dígame.

Editar : la pregunta se respondió tal como está, pero esa fue la pregunta incorrecta. La pregunta correcta habría sido "¿Cómo configurar un repositorio git desnudo en el servidor para usar con acceso ssh?". Mira mi propia respuesta.

Samuel Rossille
fuente

Respuestas:

5

cree un grupo, myrepouserspor ejemplo, y agregue sus usuarios de git a ese grupo.

Luego cambie el grupo de todo en / path / to / git / myrepo a myrepousers:

chown -R .myrepousers /path/to/git/myrepo

Luego arregle los permisos:

chmod -R g+w /path/to/git/myrepo
find /path/to/git/myrepo -type d -exec chmod -R {} g+s \;

Debería estar todo listo.

Sarga
fuente
2
Si quieres entender lo que está pasando aquí, Samuel, busca "setgid" en Google. La magia aquí está en el g+s. Por supuesto, primero tendrás que entender los conceptos básicos de chmod.
iconoclasta
Pensé que había entendido cómo hacer eso con + s en el directorio, pero no hizo lo que esperaba: los permisos no se transmitieron a los nuevos directorios. ¿Qué significan los últimos y 3ros últimos tokens: {} y \ Gracias de antemano.
Samuel Rossille
{}- es un marcador de posición para la sustitución de nombre de archivo. ;es el terminador del comando ejecutado por -exec. Como ;tiene un significado especial bash, debe escaparse con \. ver man findpara más detalles
Serge
4

En realidad ese fue el enfoque equivocado. Después de investigaciones adicionales, descubrí que en mi caso tengo que usar las funciones de compilación de git para manejar el sistema de archivos directamente en el repositorio.

Básicamente se hace con la sharedopción de git init, que puede tener (entre otros) los siguientes valores:

  • group: inicialice el repositorio para que los archivos y directorios tengan acceso de escritura de usuarios y grupos, y todos los demás tengan acceso de lectura
  • 0660: igual pero sin acceso de lectura para los demás.

Los directorios y archivos recién creados tienen automáticamente los permisos correctos. También puede usar git initen un repositorio existente para reconfigurarlo sin perder su contenido.

Así que al final lo que tuve que hacer:

  • Crear un grupo mygitrepo
  • Añadir usuarios a ella
  • chmod -R el repositorio de git para root:mygitrepo

Y ahora todos los usuarios del grupo pueden tirar / empujar, y nadie más puede, y eso sin meterse con los derechos del sistema de archivos.

git init --bare --shared=0660

http://www.kernel.org/pub/software/scm/git/docs/git-init.html para obtener más información.

Samuel Rossille
fuente
2

Si las ACL son compatibles, puede hacerlo con las ACL predeterminadas. Tenga en cuenta que es fácil olvidarse de ellos, ya que no aparecen cuando lo hace ls -l.

find /path/to/git/myrepo -type d -exec setfacl -m d:u:john:rwx {} +

Pero, sospecho que es posible que desee hacer algo un poco más organizado. La implementación de gitolita puede proporcionar una mejor solución.

Stéphane Chazelas
fuente
1
Al menos con Debian Wheezy ls(y creo que Squeeze también) obtienes un +final de los permisos para decir que hay una ACL:drwxr-xr-x+ 2 anthony anthony 4096 Sep 28 11:16 i-have-an-acl
derobert
Gracias, esto funciona, pero ¿podría aclarar el significado de los dos últimos tokens: {} +
Samuel Rossille
Esa es la find ... -exec cmd {} +sintaxis, donde {}se reemplaza con la mayor cantidad posible de nombres de archivos encontrados (en caso de {} \;que {}solo se reemplaza con un archivo encontrado a la vez)
Stéphane Chazelas