2017-10-17 10 views
0

Comment puis-je empêcher l'envoi d'un fichier (.json) avec un hook git?Comment puis-je empêcher qu'un fichier (.json) soit validé avec un hook git?

J'ai un .json qui est encore sur le serveur. Donc je ne peux pas utiliser un gitignore. Mais maintenant je ne veux pas permettre à quiconque de changer ce fichier (le commettre) parce que cela casserait quelque chose. Je veux utiliser un crochet local.

Comment puis-je même obtenir le fichier spécial dans le commit?

Pourriez-vous s'il vous plaît me donner une instruction comment y parvenir?

Merci de votre aide.

+0

Vous souhaitez empêcher l'exécution du fichier généré automatiquement ou du fichier de code? – LethalProgrammer

+0

Non désolé, c'est un peu compliqué à expliquer. Je veux que le hook vérifie si un fichier spécial sera validé et abandonne le commit si le fichier est dans le commit. – Coder949

+2

oui c'est possible de faire. Vous pouvez écrire une règle de hook pré-commit, qui sera déclenchée pendant la validation et supprimera le fichier s'il existe et ensuite il sera validé. – LethalProgrammer

Répondre

3

Un échantillon pre-commit:

#!/bin/bash 

ipath="foo/bar.json" 
git diff --cached --name-only | if grep -qE "^$ipath$";then 
    git reset HEAD -- "$ipath" 
    echo "Warning: $ipath is removed from the index. It's not allowed to be committed." 
fi 

git diff --cached --name-only liste tous les fichiers modifiés qui vont être engagés. Si foo/bar.json est trouvé dans la liste, alors git reset HEAD -- foo/bar.json le supprime de l'index afin qu'il ne soit pas validé mais laissé dans l'arbre de travail.

Cela fonctionne très bien pour vous. Cependant, vous ne pouvez pas vous assurer que c'est le cas pour les autres. Par exemple, d'autres contributeurs peuvent le supprimer de leurs référentiels locaux. Ce dont vous avez besoin est un crochet pre-receive dans le dépôt central, celui du côté serveur. Il rejette toute poussée si la validation entrante touche foo/bar.json.

Un échantillon pre-receive:

#!/bin/bash 

ipath="foo/bar.json" 
zero="0000000000000000000000000000000000000000" 

while read old new name;do 
    if [ "$zero" == "$old" ];then 
     #creating new ref, do something here 
     continue 
    fi 

    if [ "$zero" == "$new" ];then 
     #deleting a ref, do something here 
     continue 
    fi 

    #updating a ref, check if the incoming commits touch `foo/bar.json` 
    git diff $old..$new --name-only | if grep -qE "^$ipath$";then 
     c=$(git log $old..$new --pretty=%H -- $ipath) 
     echo "Error: $ipath is changed in:" 
     echo $c 
     echo "Error: $ipath is not allowed to be committed and pushed." 
     exit 1 
    fi 
done 

Les collaborateurs reçoivent le message d'erreur après git push. Ils doivent modifier leurs validations et supprimer les modifications de foo/bar.json avant un nouvel essai. Dans pre-receive, vous devez traiter deleting a ref et creating a ref si nécessaire.

+0

Merci! Le problème est que le côté serveur ne le supporte pas. Donc je dois le faire localement. Mais la première partie le fera pour moi localement? – Coder949