2016-10-06 2 views
0

J'ai deux branches sur mon repo nu, Master et "desarrollo" qui est le développement en espagnol. Je veux créer un crochet de pré-réception pour éviter de pousser les conflits au centre nu. Ce crochet serait positionné sur le centre nu. Voilà ce que j'ai:Comment éviter les conflits de push avec un hook de pré-réception placé sur le repo nu distant?

#!/bin/bash 

protected_branch='master' 





# check each branch being pushed 


while read local_ref local_sha remote_ref remote_sha 

do 

if git diff "$old_sha" "$new_sha" | grep -qE '^+?(<<<<<|>>>>>)'; then 
    echo "Saw a conflict marker in $(basename "$refname")." 
    exit 1 
fi 

remote_branch=$(echo $remote_ref | sed -e 's,.*/\(.*\),\1,') 

if [ $protected_branch = $remote_branch ] 

then 

echo "ABORT PUSH: Not allowed to push directly to $protected_branch." 

exit 1 # push will not execute 

fi 

done 

exit 0 

La première partie est d'empêcher de pousser les fichiers en conflit, et la deuxième partie est d'empêcher de pousser à maîtriser, je laisse à la branche ne fait que repousser Desarrollo. La deuxième partie fonctionne parfaitement, mais la première partie n'empêche pas les poussées, mais elle ne génère pas non plus d'erreurs lorsque j'essaie de télécharger un fichier avec des balises non plus. Je veux la transaction échouer complètement, et pas seulement rejeter le dossier conflictuel, mais toute poussée dans le cas où il y a même un seul fichier en conflit:

if git diff "$old_sha" "$new_sha" | grep -qE '^+?(<<<<<|>>>>>)'; then 
     echo "Saw a conflict marker in $(basename "$refname")." 
     exit 1 
    fi 

Je dois dire que je copiais les deux parties de différentes sources, donc il faut être quelque chose de mal avec les noms de variables, je veux juste savoir est old_sha et new_sha variables sont la raison pour laquelle cela échoue depuis que je ne suis pas particulièrement bon à faire des crochets

EDIT: J'ai changé la comparaison de chaîne de 5 à 7 '< < < < < < <' et maintenant cela fonctionne perfec tly, le script final est

#!/bin/bash 

protected_branch='master' 


# check each branch being pushed 


while read old_sha new_sha refname 
do 

if git diff "$old_sha" "$new_sha" | grep -qE '^+?(<<<<<<<|>>>>>>>)'; then 
    echo "Saw a conflict marker in $(basename "$refname")." 
    exit 1 
fi 

remote_branch=$(echo $refname | sed -e 's,.*/\(.*\),\1,') 

if [ $protected_branch = $remote_branch ] 

then 

echo "ABORT PUSH: Not allowed to push directly to $protected_branch." 

exit 1 # push will not execute 

fi 

done 

exit 0 

Répondre

1

Votre temps semble être faux. Comme vous pouvez le voir sur git help hooks dans la section sur pre-receive, l'entrée est <old-value> SP <new-value> SP <ref-name> LF par ligne, donc votre while devrait probablement être while read old_sha new_sha refname. Alors votre vérification de conflit d'origine devrait être correcte et vous devez adapter la protection de branche pour utiliser $refname au lieu de $remote_ref, alors tout devrait probablement fonctionner.

Vous avez probablement copié cette partie à partir d'un script pre-push où l'entrée est <local ref> SP <local sha1> SP <remote ref> SP <remote sha1> LF par ligne.

+0

Maintenant, cela fonctionne, mais le problème est qu'il continue à rejeter le push quoi qu'il arrive avec le message "Saw a conflict marker in desarrollo" et je ne semble pas avoir de fichiers en conflit ..... git diff - -name-only --diff-filter = UI vérifié avec cette commande et la liste est vide ..... Est-ce que la vérification que je fais est la bonne façon de vérifier les conflits sur le script bash en utilisant le <<<<< << chaîne ou il y a une meilleure alternative là-bas ?? ... Mon script est maintenant https://codeshare.io/266oZ – Juan

+0

J'ai changé les chaînes de caractères de '<<<<<' à '<<<<< << 'puisque j'avais des fichiers qui avaient <<<<< et n'étaient pas conflictuels et git met exactement 7 <. Merci beaucoup pour votre aide mon ami. Problème résolu – Juan