2009-11-02 23 views
39

Tengo algunos repositorios git a los que se accede de forma remota a través de SSH y quiero que algunos de ellos sean de solo lectura para evitar más intentos. Algunas personas tienen controles remotos apuntando a estos repositorios.¿Cómo hacer un repositorio de git de solo lectura?

Estos depósitos vacíos se inicializaron --shared=group, por lo que se establecen los permisos de archivos en 660 para todos los archivos lo suficientemente buenos como para permitir el acceso SSH, pero no permitir las escrituras? ¿O hay una forma más fácil?

Saludos.

Respuesta

39

Hay más de una forma posible de hacerlo.

  • Si los usuarios tienen cada uno una cuenta shell (quizás limitado), y cada uno de ellos acceder a los repositorios Git a través de su propia cuenta, puede utilizar permisos de acceso a archivos para controlar el acceso SSH a los repositorios Git. En Unix, esos serían permisos de escritura en los directorios , quizás con la ayuda de crear un grupo y permisos específicos para un grupo (con el "conjunto de ID de grupo adhesivo").

  • Empujar requiere git-receive-pack estar en $ PATH del usuario, y ser ejecutables para ellos ... aunque no estoy seguro de cómo sería factible este enfoque.

  • Usted puede utilizar update o pre-receive gancho hacer el control de acceso al repositorio, por ejemplo usando update-paranoid ejemplo gancho de contrib/hooks en las fuentes de Git.

  • con mayor número de usuarios que podría ser mejor con el uso de una herramienta para administrar el acceso a repositorios Git, como Gitosis (en Python, requiere setuptools) o Gitolite (en Perl).

  • para acceso de sólo lectura se puede configurar git daemon para proporcionar acceso anónimo (y no autenticado) a través de git:// protocolo, en lugar de acceso a través del protocolo SSH sólo lectura.

    Consulte la documentación para la variable de configuración url.<base>.insteadOf para facilitar la transición del protocolo SSH al protocolo GIT.


Véase también el Capítulo 4. "Git on the Server" de Pro Git libro de Scott Chacon (CC-BY-NC-SA licencia).

+2

Debe tener en cuenta que para los permisos del sistema de archivos, puede usar chmod, como lo sugiere Pat Notz. –

+8

Gracias por las ideas (a todos). Inspirado por el gancho de ejemplo de actualización paranoica, ahora tengo un gancho en mis repositorios que simplemente 'echo' Cerrado para todos los empujes "; exit 1' –

+1

@SteveFolly Si su comentario fue una respuesta, lo votaría en lugar de la respuesta aceptada. El tuyo es corto, al grano, y funciona. –

3

Dado que git se basa principalmente en el sistema de archivos para el control de acceso, eso funcionará. Tenga en cuenta que en sus permisos, el mundo no tiene acceso al archivo, pero el usuario y el grupo tienen acceso de lectura/escritura. Si quieres que sea legible por todo el mundo, tus permisos deben ser 0444.

Puede hacer un control más detallado configurando los permisos repo como 0664 donde el usuario es nobody y el grupo es algo así como gitdevs. Entonces, solo las personas en el grupo gitdevs tendrán la capacidad de escribir en el repositorio, pero el mundo puede leer de él.

SeguimientoHere is a link que cubre varias formas de compartir tu repositorio y cubiertas vienen de pro & contras y funciones de control de acceso.

+0

666 es archivos de lectura y escritura mundo. 776 es legible, editable y ejecutable en todo el mundo y en grupo, y otros usuarios pueden leer y escribir. No estoy seguro de dónde obtuvo los números que está recomendando, pero generalmente son peligrosos. – Dustin

+0

Gracias, corrigió mi respuesta. Demasiado tipeo, no suficiente pensamiento. – jheddings

0

Otra posibilidad es el protocolo git, pero requiere que git daemon se esté ejecutando.

1

Si necesita control de acceso también, consulte gitosis. Bastante fácil de configurar y puedes usar una secuencia de comandos simple para controlar quién puede hacer qué.

+1

O gitolite: http://github.com/sitaramc/gitolite –

9
chmod -R a-w /path/to/repo.git 
+0

"haga algunos de ellos de solo lectura para evitar más empujones" - esto evitaría tirar, ¿no? – user3175580

7

Un pre-receive gancho que simplemente imprime un mensaje informativo y sale con un estado distinto de cero hace el trabajo.

Asumiendo que poner un poco de información significativa en su mensaje, sino que también reduce las consultas de los usuarios frustrados que preguntan por qué no pueden empujar:

#!/bin/bash 
echo "==================================================" 
echo "This repository is no longer available for pushes." 
echo "Please visit blah blah yadda yadda ...." 
echo "==================================================" 
exit 1 
0

Recientemente he utilizado limitar el acceso a la ruta "/ repo. git/git-receive-pack "para lograr el resultado de que el repositorio es de lectura-escritura para algunos usuarios y de solo lectura para algunos otros. En configuración httpd se ve así:

<Location /repo.git/> 
      Require group developers developers-ro 
    </Location> 

    <Location /repo.git/git-receive-pack> 
      Require group developers 
    </Location> 
Cuestiones relacionadas