2010-03-18 4 views
36

J'ai une idée de verrouiller un référentiel d'utilisateurs qui y poussent des fichiers en ayant un script de verrouillage dans le hook de mise à jour GIT car le push ne peut reconnaître l'ID utilisateur que comme argument. branches. Donc je peux verrouiller tout le repo qui verrouille juste un répertoire.Existe-t-il un moyen de verrouiller une branche dans GIT?

Existe-t-il un moyen de verrouiller une branche spécifique dans GIT?

Ou y a-t-il un moyen pour que Update Hook puisse identifier à partir de quelle branche l'utilisateur pousse et vers quelle branche le code est poussé?

+1

souhaitez-vous verrouiller le nom de la branche pour toujours (balises d'utilisation alors), ou tout simplement empêcher d'autres personnes de pousser à cela? – hasen

+0

Voir aussi http://stackoverflow.com/a/5097437/6309 – VonC

+0

Qu'y a-t-il de mal à avoir un dépôt séparé et à y entrer? Ce serait un flux de travail plus standard. –

Répondre

34

La branche étant poussé à est le premier paramètre à la update hook. Si vous voulez verrouiller la branche myfeature pour pousser, ce code (placé dans hooks/update) le fera:

#!/bin/sh 
# lock the myfeature branch for pushing 
refname="$1" 

if [[ $refname == "refs/heads/myfeature" ]] 
then 
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
    echo "You cannot push to myfeature! It's locked" 
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
    exit 1 
fi 
exit 0 
+2

Je ne vois pas de répertoire .git dans le repo distant sur GitHub. Je vois un répertoire .git seulement dans mon repo cloné local. Mais je ne pense pas que mettre ce code.git/hooks/update dans mon repo local aura pour effet de bloquer quiconque de pousser vers cette branche distante de leur repo local. Est-ce que je manque quelque chose? –

+0

@AjoyBhatia Il doit y avoir un répertoire .git. Si c'est un référentiel nu, alors le répertoire principal est déjà le répertoire .git. (C'est un repo nu si vous avez des fichiers/dossiers comme HEAD, branches, hooks, config, etc.) Placez votre hook dans le hook/dir – pentix

8

Le crochet de mise à jour, à partir de la documentation:

Le crochet exécute une fois pour chaque ref être mis à jour, et prend trois paramètres:

  • le nom de l'arbitre mis à jour,
  • l'ancien nom d'objet stocké dans le ref,
  • et le nouveau nom d'objet à stocker dans la référence.

... Alors oui, il sait exactement ce que la branche est poussé, et peut simplement vérifier que le paramètre et l'échec sortie si elle ne veut pas la branche poussé à.

Et si vous voulez (intelligemment) le font avant l'utilisateur a téléchargé les objets, vous pouvez utiliser le crochet pré-recevoir:

Ce crochet exécute une fois pour l'opération de réception. Il ne prend aucun argument, mais pour chaque arbitre soit mis à jour, il reçoit sur l'entrée standard une ligne du format:

<old-value> SP <new-value> SP <ref-name> LF

<old-value> est l'ancien nom d'objet stocké dans l'arbitre, <new-value> est le nouveau nom d'objet à stocker dans la référence et <ref-name> est le nom complet de la référence.

(ce sont des espaces et la ligne d'alimentation)

+0

Cette information m'aide, mais le hook de mise à jour ne connaît que la branche poussée (branche source), y a-t-il un moyen de capturer depuis le hook de mise à jour, vers quelle branche le code est-il poussé? –