Pregunta ¿Cómo comparto un repositorio Git con varios usuarios en una máquina?


Tengo un repositorio Git en un servidor de ensayo al que varios desarrolladores necesitan poder acceder. git-init Parece tener una bandera muy cerca de lo que estoy buscando: --shared, excepto que me gustaría que varias personas también se dirijan a ese repositorio. los git-clonees --shared La bandera hace algo completamente diferente.

¿Cuál es la forma más fácil de cambiar los permisos de un repositorio existente?


201
2018-06-17 01:04


origen


Estoy usando "Github para Windows" y cambio entre dos cuentas de Github: stackoverflow.com/questions/18565876/… - Alisa


Respuestas:


Los permisos son una plaga.

Básicamente, debe asegurarse de que todos los desarrolladores puedan escribir en todo el repositorio de git.

Pase a la Solución New-Wave para obtener un método superior para otorgar a un grupo de desarrolladores la capacidad de escritura.

La solución estándar

Si coloca a todos los desarrolladores en un grupo creado especialmente, puede, en principio, simplemente hacer:

chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo

Entonces cambia el umask para que los usuarios 002, para que los nuevos archivos se creen con permisos de escritura de grupo.

Los problemas con esto son legión; Si estás en una distro que asume un umask de 022 (como tener un común users grupo que incluye a todos por defecto), esto puede abrir problemas de seguridad en otros lugares. Y, tarde o temprano, algo va a arruinar tu esquema de permisos cuidadosamente diseñado, poniendo el repositorio fuera de acción hasta que obtengas root acceder y arreglarlo (es decir, volver a ejecutar los comandos anteriores).

La solución New Wave

Una solución superior, aunque menos entendida, y que requiera un poco más de soporte de SO / herramienta, es usar los atributos extendidos POSIX. Solo he venido a esta área recientemente, por lo que mi conocimiento aquí no es tan bueno como podría ser. Pero básicamente, una ACL extendida es la capacidad de establecer permisos en más de solo las 3 ranuras predeterminadas (usuario / grupo / otro).

Así que una vez más, crea tu grupo, luego ejecuta:

setfacl -R -m g:<whatever group>:rwX gitrepo
find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX

Esto configura la ACL extendida para el grupo para que los miembros del grupo puedan leer / escribir / acceder a los archivos que ya están allí (la primera línea); luego, indique también a todos los directorios existentes que los archivos nuevos deben tener aplicada esta misma ACL (la segunda línea).

Espero que te ponga en tu camino.


171
2018-06-17 06:00



git init tiene un parámetro llamado --shared que configura la variable core.sharedRepository para el trabajo en grupo. También puede establecer la variable en un repositorio existente. Eso elimina la necesidad de configurar manualmente umask como git lo establecerá en un valor razonable antes de manipular archivos. - ptman
+1 para los atributos extendidos de POSIX - ¡noticias para mí! - RobM
Cuando lo hice chmod -R g+swX, hizo a Git muy infeliz y decidió que ya no era un repositorio de git ("el repositorio no parece ser un repositorio de git"). Tuve que chmod g-s todos los archivos. Para simplemente establecer el bit setgid en la directorios, tratar find /path/to/repo -type d -print0 | xargs -0 chmod g+s. Todavía hacer el chgrp -R thegroup /path/to/repo. - rescdsk
chmod -R g+swX gitrepo aplicará el bit setguid a los archivos, lo que es un riesgo de seguridad. En su lugar, puedes usar find . -type d -exec chmod g+s {} + para aplicarlo solo a directorios. - Ian Dunn
ACL (setfacl) no tiene la configuración de setgid para imponer nuevos archivos y subdirectorios creados dentro de un directorio para heredar su ID de grupo. Por lo tanto, debe establecer setgid por separado a través de chmod. Opción compartida de Git (git-scm.com/docs/git-init), sin embargo, le permite establecer y anular la umask del usuario. - Chase T.


Si creó el repositorio (o clonó un nuevo repositorio desnudo de uno existente) con

$ git init --shared=group 

o

$ git init --shared=0NNN

Se supone que Git debe manejar los permisos más allá de lo que proporciona su umask predeterminado. Por fin, esto es cierto en mi versión de Git (1.6.3). Por supuesto, esto supone que sus usuarios están en el mismo grupo.

Sin embargo, si necesitara la administración de usuarios en varios grupos con distintos grados de lectura / escritura, recurriría a la gitosis. También he oído mencionar la gitolita (http://github.com/sitaramc/gitolite), una bifurcación de gitosis que se supone que proporciona permisos a nivel de sucursal, no puedo decir que lo haya utilizado personalmente.


113
2018-02-17 05:40



Esta es definitivamente la respuesta correcta. - ELLIOTTCABLE
Tuve este problema y esta es, con mucho, la mejor respuesta. El único problema es que la --shared El argumento toma un octal, no hexadecimal. He confirmado esto en la fuente de Git 1.7.8 y el segundo ejemplo debería ser git init --shared=0NNN. - qpingu
Que es NNN- ¿máscara de permisos o un número de grupo o algo más? - Craig McQueen
Por cierto, "grupo" es una palabra clave, no un marcador de posición para el nombre de su grupo. Se asigna el grupo mediante el comando chgrp. Para un nuevo repo es git init --bare --shared=group myproj donde myproj es su nombre de repositorio, seguido de chgrp -R mygroup myproj donde mi grupo es el nombre de tu grupo - labradort
Tenga en cuenta que si sus usuarios se comprometen cuando su grupo predeterminado es diferente de lo que debería ser, puede arruinar las cosas. Para solucionar este problema, necesitará que cada usuario modifique cada archivo que posee en el repositorio al grupo correcto. Esto ocurrirá a menos que descubras cómo hacer que todos creen / cambien los archivos nuevos en / al grupo correcto antes de comprometerse y presionar. - ragerdl


Esto no se ha dicho, así que quiero agregarlo rápidamente.

Para asegurarse de que los problemas de permisos no recorten su cabeza fea, asegúrese de establecer lo siguiente en el archivo de configuración del repositorio compartido de git:

[core]
    sharedRepository = true

Esto asegurará que se respeten las configuraciones "umask" de su sistema.


50
2018-03-09 05:52



Según git-config (1) (kernel.org/pub/software/scm/git/docs/git-config.html) core.sharedRepository, debe configurar esto en "umask" o "false" para que git respete la umask del usuario. - David Schmitt
Esta y la respuesta del usuario 35117 es correcta. Tenga en cuenta que "verdadero" es lo mismo que "grupo", y esto se puede configurar con el comando git config core.sharedRepository true. - ColinM
¿Sigue cambiando la propiedad de un archivo cuando se empuja a remoto? - Duc Tran
Si desea configurar esto al clonar en lugar de después del hecho, el equivalente de git init --sharedes git clone --config core.sharedRepository=true. Extraño de git para usar --shared para tales significados diferentes en tales órdenes similares. - stevek_mcc


los Manual de usuario de Git describe cómo compartir un repositorio de varias maneras.

Más complicadas, aunque las formas completas de compartir repositorios son:

Usamos GitHub para un equipo de 6 desarrolladores.


21
2018-06-17 07:35



Me gusta la gitosis. Es una forma bastante efectiva de controlar el acceso basado en claves públicas. - Mike Mazur
¿Cómo soluciona cualquiera de estas soluciones el problema de "Me gustaría que varias personas se retiraran a ese repositorio"? - womble♦
Echa un vistazo a la gitosis. que uno resuelva tu problema - pilif
Cuando compartes el repositorio, la gente podrá extraerlo. Es probable que necesiten clonarlo o agregar una rama remota. La documentación que vinculé lo guiará muy claramente para resolver su problema; He usado todos los métodos descritos para ayudar a los desarrolladores a colaborar con el código fuente de Git. Que yo sepa, ServerFault no es para agarrar. - jtimberman
Tengo que estar de acuerdo con el uso de Gitosis. Evita el problema de los permisos utilizando una sola cuenta autenticada por varias claves SSH. También se maneja completamente a través de git commit. - Jeremy Bouse


También mira gitolita para alojar tu repositorio git. Aparentemente la gitosis ya no se está desarrollando.


9
2018-01-19 08:55





Una forma de arreglar los permisos en el repositorio compartido, para que los usuarios no tengan problemas de permisos al momento de presionar, es crear un script de enlace posterior a la actualización que hará exactamente eso. Esto debería funcionar en cualquier versión de git.

Supongamos que tiene un repositorio compartido en /myrepo.git. Todos los archivos en ese repositorio pertenecen a decir mysharedgroup. Todos los usuarios que ingresen a ese repositorio deben pertenecer a mysharedgroup además. Ahora crea el siguiente archivo (cambiando mysharedgroup a sus preferencias):

/myrepo.git/hooks/post-update

#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null

4
2017-09-27 14:35



La respuesta correcta para cuando los usuarios tienen diferentes grupos predeterminados. - Pat
La configuración del bit setgid en un directorio hará que los archivos que los usuarios creen hereden la misma propiedad del grupo que el directorio (si los usuarios pertenecen a ese grupo). Incluso si no es el grupo predeterminado de los usuarios. Entonces este gancho no es necesario. Esto es lo que hace la respuesta de @ womble (y mi comentario al respecto). - rescdsk
En mi máquina centos7, después de probar todas las soluciones enumeradas en esta página, una variante de la solución de @ bkmks anterior fue la única opción que realmente funcionó (configurar los ganchos posteriores a la fusión y posteriores al pago en lugar de los posteriores a la actualización como se indica arriba). - Mike Godin


Para agregar los bits y piezas de buenos consejos de las otras respuestas y comentarios sobre la configuración de un nuevo repositorio:

Si está configurando un nuevo repositorio. myrepo en /srv/git para el grupo mygroup, Esto es lo que quieres:

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
  1. la primera línea crea el directorio de repositorio
  2. la segunda línea establece su grupo a mygroup
  3. la tercera línea inicializa un repositorio simple con la siguiente configuración:
    1. core.bare = true: convertirlo en un repo desnudo
    2. core.sharedrepository = 1 (igual que core.sharedrepository = group): el directorio repo y todos los directorios que se creen posteriormente serán administrados por git para permitir mygroup leer, escribir y ejecutar permisos (con el conjunto de bits sgid también - para trabajar con usuarios para los cuales mygroup no es su grupo primario)
    3. receive.denyNonFastforwards = 1: negar los empujes no rápidos hacia el repositorio

Si desea ajustar los permisos de los usuarios, grupos u otros usuarios, utilice --shared=0NNN, dónde NNN son el usuario estándar, el grupo y otros bits para archivos (los bits de ejecución y sgid en directorios será gestionado adecuadamente por git). Por ejemplo, esto permite acceso de lectura y escritura al usuario, y acceso de solo lectura al grupo (y no acceso a otro):

git init --bare --shared=0640 /srv/git/myrepo.git

Esto permite el acceso de lectura y escritura al usuario y al grupo (y no a otros):

git init --bare --shared=0660 /srv/git/myrepo.git

Esto permite el acceso de lectura y escritura al usuario y grupo, y el acceso de solo lectura a otros:

git init --bare --shared=0664 /srv/git/myrepo.git

Tenga en cuenta que si no va a permitir el acceso de escritura al grupo, asegúrese de usar primero chown para establecer el propietario del repositorio, y luego ejecute el git init comando como ese usuario (para asegurarse de que el repositorio se inicialice con el propietario correcto para todos los archivos y subdirectorios iniciales).


3
2018-05-26 01:24



Más correcto que las respuestas de voto superior. - XO01


Puedes usar git-daemon para compartir el repositorio. Lea la documentación para git-daemonpara más información.

EDITAR:

También puedes ver este artículo 8 maneras de compartir tu repositorio git.


2
2018-06-17 02:58





Hacer exactamente esto funcionó para mí, para un repositorio existente. Esto toma el consejo de varias respuestas y comentarios antes:

Desde su directorio padre del repositorio, en el servidor:

chgrp -R <whatever group> gitrepo
chmod -R g+wX gitrepo
cd gitrepo
find . -type d -exec chmod g+s {} +
git config core.sharedRepository group

1
2017-12-13 12:44