2010-04-03 6 views
7

Lorsque vous activez le crochet pré-réception pour dépôt git:Git pré-réception crochet

Il ne prend aucun argument, mais pour chaque ref à jour il reçoit sur l'entrée standard une ligne du format:

< ancienne valeur> SP < nouvelle valeur> SP < ref-name> LF

où < ancienne valeur> est l'ancien nom d'objet stocké dans l'arbitre, < nouvelle valeur> est le nouveau nom de l'objet être stocké dans l'arbitre et est le nom complet e de la ref. Lors de la création d'une nouvelle référence, < ancienne valeur> est 40 0.

Est-ce que quelqu'un peut me expliquer comment puis-je examiner tous les fichiers qui seront modifiés dans le référentiel si je permets ce commettre? Je voudrais exécuter ces fichiers à l'aide de scripts pour vérifier la syntaxe et ainsi de suite.

Merci.

Répondre

18

Bizarrement, j'avais du code qui traînait à partir d'un utilitaire git -> Wordpress qui pouvait aider. Ce qui suit vous donnera une liste de tous les fichiers modifiés dans la réception, ainsi que leur contenu. Aucune garantie, peut-être des bugs, peut-être pas le moyen le plus efficace de le faire, bla bla bla. Une partie de ce code est basé sur des choses dans gitshelve, ce qui est une très bonne chose à regarder pour la maniabilité géniale.

+0

Merci pour ce code, cela a beaucoup aidé! J'ai fait un tweak mineur à 'get_changed_files' donc il utilise' --name-only' ce qui rend le résultat plus facile: https://gist.github.com/1055516 – keegan3d

1

Si vous voulez savoir si la permissions des fichiers sont modifiés dans le référentiel local avant de pousser au dépôt distant, exécutez git ls-tree -r commit, où la validation est SHA commit valeur du référentiel local.

Cette commande donne une liste de fichiers avec leurs autorisations, qui peuvent être analysées pour vérifier si l'autorisation d'un fichier a été modifiée avant de l'envoyer.

9

Je viens de le faire. Voici le flux de base que j'ai utilisé.

Dans votre crochet avant de recevoir, lire chaque ligne de stdin, qui (comme vous l'avez mentionné) ressembler à ceci:

oldref newref refname 
  1. Pour chaque (oldref, newref) paire vous devez énumérer tous les commits:

    git show --format=format:%H --quiet oldref..newref 
    
  2. pour chaque vous vous engagez devez lister tous les fichiers:

    git diff --name-only commit^..commit 
    
  3. pour examiner un fichier, utilisez git show:

    git show commit:filepath 
    

    faire tout ce que la vérification du contenu des fichiers ici.Si vous souhaitez notifier à l'utilisateur d'un problème, écrivez à stderr

  4. après itérer tous les refs, engage et les fichiers de sortie non nul de rejeter la poussée, ou zéro pour lui permettre

Notez que cette approche marche tous les commits dans l'ordre, donc si un fichier est modifié dans plusieurs commits chaque version sera examinée. Si vous ne voulez voir qu'une seule fois chaque fichier, passez les commits dans l'ordre inverse et n'examinez pas deux fois un fichier donné. Je recommande cependant la première approche pour que toutes les versions des fichiers poussés soient examinées.

+0

D'une certaine manière, je n'ai pas pu me débarrasser de la différence 'git show --format = format:% H --quiet oldref..newref'. Peut-être parce que j'ai ajouté de nouveaux fichiers dans le repo et le diff était contre/dev/null: D. Je pense que 'git log --format =% H oldref newref' devrait faire la même chose et il n'y a pas de diff :) –

Questions connexes