Tengo un repositorio de Git en un servidor de ensayo al que varios desarrolladores deben poder acceder. git-init
parece tener una bandera muy cercana a lo que estoy buscando: --shared
excepto que me gustaría que varias personas también accedan a ese repositorio. La bandera de git-clone
's --shared
hace algo completamente diferente.
¿Cuál es la forma más fácil de cambiar los permisos de un repositorio existente?
permissions
git
users
share
Andrey Fedorov
fuente
fuente
Respuestas:
Los permisos son una plaga.
Básicamente, debe asegurarse de que todos esos desarrolladores puedan escribir a todo en el repositorio de git.
Vaya a The New-Wave Solution para obtener el método superior de otorgar capacidad de escritura a un grupo de desarrolladores.
La solución estándar
Si coloca a todos los desarrolladores en un grupo creado especialmente, puede, en principio, simplemente hacer lo siguiente:
Luego cambie el
umask
para que los usuarios002
lo hagan, de modo que se creen nuevos archivos con permisos de escritura grupal.Los problemas con esto son legión; Si está en una distribución que asume una
umask
de022
(como tener unusers
grupo común que incluye a todos por defecto), esto puede abrir problemas de seguridad en otros lugares. Y tarde o temprano, algo arruinará su esquema de permisos cuidadosamente diseñado, poniendo el repositorio fuera de acción hasta que obtengaroot
acceso y lo arregle (es decir, vuelva a ejecutar los comandos anteriores).La solución de la nueva ola
Una solución superior, aunque menos comprendida, y que requiere un poco más de soporte de sistema operativo / herramienta, es utilizar atributos extendidos POSIX. Solo he venido a esta área hace poco, así 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 que solo las 3 ranuras predeterminadas (usuario / grupo / otro).
Entonces, una vez más, crea tu grupo, luego ejecuta:
Esto configura la ACL extendida para el grupo para que los miembros del grupo puedan leer / escribir / acceder a cualquier archivo que ya esté allí (la primera línea); luego, también indique a todos los directorios existentes que los archivos nuevos deben tener esta misma ACL aplicada (la segunda línea).
Espero que te ponga en tu camino.
fuente
chmod -R g+swX
, hizo que Git se sintiera muy infeliz y decidió que ya no era un repositorio de git ("repo no parece ser un repositorio de git"). Tuve que modificar todos los archivos . Para establecer el bit setgid en los directorios , intentefind /path/to/repo -type d -print0 | xargs -0 chmod g+s
. Todavía hago elchgrp -R thegroup /path/to/repo
.chmod -R g+swX gitrepo
aplicará el bit setguid a los archivos, lo cual es un riesgo de seguridad. En su lugar, puede usarlofind . -type d -exec chmod g+s {} +
para aplicarlo solo a directorios.si creó el repositorio (o clonó un nuevo repositorio desnudo de uno existente) con
o
Se supone que Git maneja 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 múltiples grupos con diferentes grados de lectura / escritura, iría con 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, aunque no puedo decir que la haya usado personalmente.
fuente
--shared
argumento toma un octal, no hexadecimal. He confirmado esto en la fuente de Git 1.7.8 y el segundo ejemplo debería sergit init --shared=0NNN
.NNN
máscara de permisos o un número de grupo u otra cosa?git init --bare --shared=group myproj
donde myproj es su nombre de repositorio, seguido dechgrp -R mygroup myproj
donde mygroup es el nombre de su grupo.Esto no se ha dicho, por lo que quiero agregarlo rápidamente.
Para asegurarse de que los problemas de permisos no recorten su cabeza fea, asegúrese de configurar lo siguiente en el archivo de configuración del repositorio compartido de git:
Esto asegurará que se respete la configuración de "umask" de su sistema.
fuente
git config core.sharedRepository true
.git init --shared
esgit clone --config core.sharedRepository=true
. Es extraño usar git para--shared
significados tan diferentes en comandos tan similares.El Manual del usuario de Git describe cómo compartir un repositorio de varias maneras.
Más complicadas, aunque las formas completas de compartir repositorios son:
Utilizamos GitHub para un equipo de 6 desarrolladores.
fuente
También mire gitolite para alojar su repositorio git. Aparentemente, la gitosis ya no se está desarrollando.
fuente
Una forma de corregir los permisos en el repositorio compartido, para que los usuarios no tengan problemas de permisos al presionar, es crear un script de enlace posterior a la actualización que haga 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 ingresan a ese repositorio también deben pertenecer a mysharedgroup . Ahora cree el siguiente archivo (cambiando mysharedgroup a sus preferencias):
/myrepo.git/hooks/post-update
fuente
/dev/null
. Deje que el usuario vea primero estos mensajes y luego decida por sí mismo.Para agregar los fragmentos de buenos consejos de las otras respuestas y comentarios sobre la configuración de un nuevo repositorio:
Si está configurando una marca nueva operación
myrepo
en/srv/git
el grupomygroup
, esto es lo que quiere:mygroup
core.bare = true
: hazlo un repositorio desnudocore.sharedrepository = 1
(igual quecore.sharedrepository = group
): el directorio repo y todos los directorios creados posteriormente en él serán administrados por git para permitirmygroup
permisos de lectura, escritura y ejecución (también con el bit sgid establecido) para trabajar con usuarios para quienesmygroup
no es su grupo primario)receive.denyNonFastforwards = 1
: denegar empujes no rápidos hacia el repositorioSi desea ajustar los permisos de usuario, grupo u otros usuarios, use
--shared=0NNN
, dondeNNN
están el usuario estándar, el grupo y otros bits para archivos (los bits de ejecución y sgid en los directorios serán administrados adecuadamente por git). Por ejemplo, esto permite el acceso de lectura y escritura al usuario, y el acceso de solo lectura al grupo (y sin acceso a otros):Esto permite el acceso de lectura y escritura al usuario y al grupo (y ningún acceso a otros):
Esto permite el acceso de lectura y escritura al usuario y al grupo, y el acceso de solo lectura a otros:
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 elgit init
comando como ese usuario (para asegurarse de que el repositorio se inicialice con el propietario correcto para todos los archivos iniciales y subdirectorios).fuente
Puede usar git-daemon para compartir el repositorio. Lea la documentación de git-daemon para más información.
EDITAR:
Consulte también este artículo 8 formas de compartir su repositorio git .
fuente
Hacer exactamente esto funcionó para mí, para un repositorio existente. Esto toma consejos de varias respuestas y comentarios antes:
Desde su directorio padre del repositorio, en el servidor:
fuente
La respuesta de @stevek_mcc es la que estaba buscando cuando busqué en Google esta pregunta
fuente