2010-11-04 4 views
11

Alors avant d'exécuter git commit je souvent exécutez la commande suivante:Comment grep à travers vos fichiers mis en scène avant de s'engager?

git grep --cached -l -I "debugger" 

Je pensais qu'il était semblable à:

git diff --cached 

(qui vous montrera tous les changements que vous êtes sur le point de commettre, à savoir vous montrera le diff dans vos fichiers mis en scène).

Malheureusement, je viens de trouver que l'option --cached pour git grep dit simplement à git de "seulement" regarder tout dans son index.

Alors, comment puis-je exécuter git grep et le faire grep uniquement à travers mes fichiers mis en scène?

(Oui, je sais que je pourrais simplement faire git diff --cached et la recherche dans, mais je préférerais avoir la capacité programmatique à grep dans mes fichiers mis en scène.)

+0

Alors, avez-vous réussi à résoudre ce problème? Je serais intéressé par la réponse. – ZeroOne

Répondre

10

Beaucoup de crochets pré-commit utilisent git diff-index --cached -S<pat> REV pour trouver modifications qui ajoutent ou suppriment un motif particulier. Donc, dans votre cas, git diff-index --cached -Sdebugger HEAD. Vous pouvez également ajouter -u pour obtenir un diff, sinon il identifie simplement le fichier incriminé.

+4

L'option '-S' prend une chaîne fixe, pas une regex. (Je ne suis pas sûr de ce que vous vouliez dire par "pat".) Cependant, git diffcore a récemment gagné l'option '-G ', ce qui devrait vous permettre de faire tout ce que vous essayez de faire avec 'git grep'. Ce n'est pas encore dans une version publiée, mais sur la branche principale 'git.git'. – Cascabel

+2

OK cela me rapproche de ce dont j'ai besoin, mais pas 100% là. Cela vous donnera une correspondance positive pour votre -S s'il a été ajouté ou supprimé. Je ne veux qu'une correspondance renvoyée si elle a été * ajoutée *. Y'a-t'il un quelconque moyen d'y arriver? – steve

0

Vous devez d'abord obtenir une liste de fichiers de l'index (à l'exclusion des fichiers supprimés). Cela peut être fait avec les éléments suivants:

git diff --cached --name-only --diff-filter=d HEAD 

Ensuite, vous devez utiliser le préfixe pour accéder au contenu d'un fichier dans l'index courant (mis en scène, mais pas encore engagé) voir gitrevisions manual pour plus d'informations.

git show :<file> 

Enfin, voici un exemple de mettre tous ensemble grep cette liste de fichiers

# Get a list of files in the index excluding deleted files 
file_list=$(git diff --cached --name-only --diff-filter=d HEAD) 

# for each file we found grep it's contents for 'some pattern' 
for file in ${file_list}; do 
    git show :"${file}" | grep 'some pattern' 
done 

également here's an example d'un crochet git pre-commit qui utilise cette méthode pour vérifier que les années de droit d'auteur sont en hausse à ce jour dans les fichiers à commettre.

Questions connexes