2009-11-02 7 views
39

J'ai quelques dépôts git accessibles à distance via SSH et je veux en faire en lecture seule pour éviter d'autres poussées. Certaines personnes ont des télécommandes pointant vers ces dépôts.Comment faire un dépôt git en lecture seule?

Ces référentiels nus ont été initialisés --shared=group, de même que la définition des autorisations de fichier sur 660 pour tous les fichiers suffisants pour autoriser l'accès SSH, mais interdire les écritures? Ou y a-t-il un moyen plus facile?

Cheers.

Répondre

39

Il existe plusieurs façons de procéder.

  • Si vos utilisateurs ont chacun un compte shell (peut-être limité), et chacun d'entre eux avoir accès aux référentiels git via leur propre compte, vous pouvez utiliser autorisations de système de fichiers pour contrôler l'accès SSH aux référentiels git. Sur Unix, ce serait des permissions d'écriture sur les répertoires , peut-être avec l'aide de la création d'un groupe et d'autorisations spécifiques pour un groupe (avec un ensemble de "code de groupe collant").

  • Pousser nécessite git-receive-pack être dans $ PATH de l'utilisateur, et être exécutable pour eux ... même si je ne suis pas sûr possible cette approche serait.

  • Vous pouvez utiliser update ou pre-receive crochet pour faire du contrôle d'accès au dépôt, par exemple en utilisant update-paranoid crochet exemple de contrib/hooks dans les sources git.

  • Avec plus grand nombre d'utilisateurs que vous pourriez être mieux avec l'aide d'un outil pour gérer l'accès aux référentiels git, comme Gitosis (en Python, nécessite setuptools) ou Gitolite (en Perl).

  • Pour accéder en lecture seule, vous pouvez configurer git daemon pour fournir un accès anonyme en lecture seule (et non authentifié) via git:// protocole, au lieu d'accès via le protocole SSH.

    Voir la documentation pour la variable de configuration url.<base>.insteadOf pour faciliter la transition du protocole SSH au protocole GIT.


Voir aussi le chapitre 4. "Git on the Server" de Pro Git livre de Scott Chacon (CC-BY-NC-SA sous licence).

+2

Notez que pour les autorisations de système de fichiers, vous pouvez utiliser chmod, comme suggéré par Pat Notz. –

+8

Merci pour les idées (tout le monde). Inspiré par l'exemple de mise à jour paranoïaque, j'ai maintenant un crochet dans mes repos qui fait simplement "echo" Fermé pour tous les push "; exit 1' –

+1

@SteveFolly Si votre commentaire était une réponse, je voterais pour celui-ci au lieu de la réponse acceptée. Le vôtre est court, au point et fonctionne. –

3

Puisque git repose principalement sur le système de fichiers pour le contrôle d'accès, cela fonctionnera. Notez que dans vos autorisations, le monde n'a pas accès au fichier, mais l'utilisateur et le groupe ont un accès en lecture/écriture. Si vous voulez une lecture universelle, vos autorisations doivent être 0444.

Vous pouvez effectuer un contrôle plus précis en définissant les autorisations repo comme 0664 où l'utilisateur est nobody et le groupe est quelque chose comme gitdevs. Ensuite, seules les personnes du groupe gitdevs auront la possibilité d'écrire dans le rapport, mais le monde pourra en lire.

SuiviHere is a link qui couvre diverses façons de partager votre pension et couvertures viennent & de pro contre et fonctions de contrôle d'accès.

+0

666 est des fichiers accessibles en lecture et en écriture. 776 est lisible par le monde et par groupe, accessible en écriture et exécutable et d'autres utilisateurs lisent et écrivent. Je ne sais pas où vous avez obtenu les chiffres que vous recommandez, mais ils sont généralement dangereux. – Dustin

+0

Merci, corrigé ma réponse. Trop de dactylographie, pas assez de réflexion. – jheddings

0

Une autre possibilité est le protocole git, mais il nécessite l'exécution du démon git.

1

Si vous avez également besoin d'un contrôle d'accès, consultez gitosis. Assez facile à mettre en place et vous pouvez utiliser un script simple pour contrôler qui peut faire quoi.

+1

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

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

"Faites en sorte que certains d'entre eux soient en lecture seule pour éviter d'autres poussées" - cela empêcherait de tirer, n'est-ce pas? – user3175580

7

Un crochet pre-receive qui imprime simplement un message informatif et quitte avec un statut non nul le travail.

En supposant que vous mettez des informations significatives dans votre message, il réduit également les requêtes des utilisateurs frustrés demander pourquoi ils ne peuvent pas pousser:

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

Récemment, j'utilisé en limitant l'accès au chemin «/repo. git/git-receive-pack "pour obtenir le résultat que le dépôt est en lecture-écriture pour certains utilisateurs et en lecture seule pour d'autres. Dans httpd config, il ressemble à ceci:

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

    <Location /repo.git/git-receive-pack> 
      Require group developers 
    </Location> 
Questions connexes