Cómo configurar un repositorio de git existente para que lo comparta un grupo UNIX

98

Tengo un repositorio de git existente (uno simple) que hasta este momento solo he podido escribir. Quiero abrirlo a algún grupo de usuarios de UNIX, foo, para que todos los miembros de foo puedan acceder a él. Soy consciente de que puedo configurar fácilmente un nuevo repositorio de git con:

git init --bare --shared=group repodir
chgrp -R foo repodir

Pero necesito la operación equivalente para un directorio de repositorio existente .

Pistos
fuente
4
Hay una excelente respuesta a esta pregunta en ServerFault (otro sitio de StackOverflow).
Zearin

Respuestas:

114

Intente esto para hacer que un repositorio existente repodirfuncione para los usuarios del grupo foo:

chgrp -R foo repodir                 # set the group
chmod -R g+rw repodir                # allow the group to read/write
chmod g+s `find repodir -type d`     # new files get group id of directory
git init --bare --shared=all repodir # sets some important variables in repodir/config ("core.sharedRepository=2" and "receive.denyNonFastforwards=true")
David Underhill
fuente
14
Agregaría que probablemente también debería configurar config.sharedRepository = true en la configuración del repositorio. kernel.org/pub/software/scm/git/docs/git-config.html
Pistos
1
Esto se acerca bastante a lo que estaba haciendo por mi cuenta, pero quería obtener una confirmación externa. Gracias. :) También esperaba que hubiera una especie de git clone --shared = group, pero la opción --shared de clone hace algo completamente diferente.
Pistos
5
Puede usar el git init --sharedcomando en un repositorio existente para establecer el valor de configuración. También debe ejecutar el chmodcomando para obtener los permisos correctos de los archivos.
Spencer
1
Confirmar esto también ayuda si estás en un lío porque alguien ha hecho un git pulletc. como root en lugar de como www-datao lo que sea que sea el propietario y como resultado obtienes error: insufficient permission for adding an object to repository database .git/objects. Pensé que había arreglado la propiedad de todos los archivos / directorios que estaban mal usando findy -type d/ type -f, pero solo este método eliminó el error (problema porque un archivo en algún subdirectorio no se puede escribir en grupo)
William Turrell
2
La umask del usuario todavía parece aplicarse a archivos recién creados. ¿Es eso lo que esperabas? Creo que la documentación de core.sharedRepositorymencionaría esto: parece inútil sin que los usuarios hagan que todos sus grupos de archivos se puedan escribir.
Sam Brightman
47

En el directorio de repositorios, ejecute los siguientes comandos:

git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir

Editar: para abordar la confusión frecuente, groupes una palabra clave real, no se supone que debe reemplazarla con el nombre del grupo.

kixorz
fuente
25
Dónde groupNO está el nombre del grupo :)
Pierre de LESPINAY
7
Los archivos de objetos y paquetes deben ser inmutables; deben tener los permisos 444 / r - r - r--.
CB Bailey
3
Después de tratar git config core.sharedRepository deva continuación, escribiendo git configconsigo fatal: bad config value for 'core.sharedrepository' in .git/configen git version 1.7.0.4(y posiblemente versiones después)
Kzqai
3
git config core.sharedRepository group groupno es el nombre del grupo, ¡sino el valor real!
kixorz
Si cometió el error de usar el nombre de su grupo en lugar de "grupo", simplemente abra .git / config en el editor de texto y edite la línea core.sharedRepository para decir "grupo".
Tom
43

Combinando las respuestas de @David Underhill y @kixorz , hice mi propia solución (definitiva).

Es para repositorios básicos y repositorios no básicos. Solo hay pequeñas diferencias entre ellos, pero de esta manera es más claro.

REPOSITORIO DESNUDO

cd <repo.git>/                            # Enter inside the git repo
git config core.sharedRepository group    # Update the git's config
chgrp -R <group-name> .                   # Change files and directories' group
chmod -R g+w .                            # Change permissions
chmod g-w objects/pack/*                  # Git pack files should be immutable
find -type d -exec chmod g+s {} +         # New files get directory's group id

dónde:

  • <repo.git>es el directorio del repositorio básico, normalmente en el servidor (por ejemplo my_project.git/).
  • <group-name>es el nombre del grupo para los usuarios de git (por ejemplo, usuarios ).

REPOSITORIO NO DESCUBIERTO

cd <project_dir>/                         # Enter inside the project directory
git config core.sharedRepository group    # Update the git's config
chgrp -R <group-name> .                   # Change files and directories' group
chmod -R g+w .                            # Change permissions
chmod g-w .git/objects/pack/*             # Git pack files should be immutable
find -type d -exec chmod g+s {} +         # New files get directory's group id

dónde:

  • <project_dir>es el directorio del proyecto que contiene la .gitcarpeta.
  • <group-name>es el nombre del grupo para los usuarios de git (por ejemplo, usuarios ).
Andrea
fuente
Como dijo Charles, también debe hacerlo: chmod g-w objects/pack/*(si no es un repositorio desnudo, anteponer .git/)
Wernight
aquí, ¿cómo podemos encontrar el nombre del grupo o cómo crear el nombre del grupo?
Sujithrao
'chmod g + s find . -type d' genera un errorunable to execute /bin/chmod: Argument list too long
Dr.X
Como señaló @ Dr.X, chmod g+s `find . -type d`no escala. Usofind -type d -exec chmod g+s {} +
hagello
Creo que todos los objetos sueltos también deberían ser de solo lectura según el estado precompartido. Quizás algo así chmod g-w objects/*/*. Sin embargo, no estoy seguro del subdirectorio de información, ya que está vacío para este repositorio.
Eric
3

Probablemente esto no sea necesario, pero vale la pena señalar que git init --bare --sharedtambién establece la opción denyNonFastForwards .

git config receive.denyNonFastForwards true

El significado de esta opción es el siguiente:

receive.denyNonFastForwards

Si rebase confirma que ya ha empujado y luego intenta empujar de nuevo, o de lo contrario intenta enviar una confirmación a una rama remota que no contiene la confirmación a la que apunta la rama remota, se le negará. En general, esta es una buena política; pero en el caso de la rebase, puede determinar que sabe lo que está haciendo y puede forzar la actualización de la rama remota con un indicador -f en su comando push.

(de http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration )

nerfólogo
fuente
1

Además de las respuestas anteriores de permitir que un grupo lea / escriba, también necesita agregar el usuario al grupo (diga "foo").

sudo usermod -a -G [groupname] [username]

Nota: primero tendrá que crear un usuario si no existe

sarvagya kumar
fuente