Euh oh, cette question semble avoir glissé à travers les fissures. J'espère que vous êtes toujours là-bas, Esben!
Vous recherchez un update hook, qui est exécuté une fois pour chaque réf mis à jour. Les arguments sont le nom de l'arbitre, le nom de l'ancien objet (commit SHA1) et le nouveau nom de l'objet. Donc, tout ce que vous devez vraiment faire est de vérifier le diff entre l'ancien et le nouveau et assurez-vous qu'il répond à vos normes. Ce n'est pas totalement simple, bien sûr, mais c'est tout à fait gérable. Voici ce que je ferais:
Enregistrez le script suivant sur .git/hooks/update
.
old=$2
new=$3
# that's a literal tab, because (ba)sh turns \t into t, not a tab
# make sure your editor doesn't expand it to spaces
git diff --name-only $old $new | egrep '(\.(cpp|h)$)|^CMakeLists.txt$' | xargs -d'\n' git diff -U0 $old $new -- | grep -q '^+.* ' && exit 1
qui répertorie tous les fichiers qui diffèrent entre les anciens et nouveaux, greps pour tous ceux désirés, obtient la diff pour eux (avec zéro lignes de contexte, étant donné que nous ne nous soucions pas), et pour greps une ligne ajoutée (commençant par +
) contenant une tabulation. Le grep quitte le succès s'il en trouve un, ce qui laissera le &&
exécuter exit 1
, provoquant l'échec de l'accrochage et l'abandon de la mise à jour! Notez que ceci est légèrement différent de vos besoins - il vérifie si le diff ajoute des caractères de tabulation. C'est probablement mieux à long terme; Une fois que vous avez vérifié que votre code existant est correct, c'est la même chose, sauf beaucoup plus rapide car il n'a pas à chercher tout le contenu.
Demandez-vous de l'aide pour écrire le crochet, ou si un crochet de mise à jour fonctionnera dans ce but? – Cascabel
Les deux en fait :) J'ai été très surpris que ce ne soit pas facilement trouvable et téléchargeable, j'ai donc le sentiment que ce n'est pas trivial. Un exemple de la façon dont un tel crochet pourrait ressembler aiderait beaucoup. –