Comment grep vos fichiers mis en scène avant de commettre?
-
29-09-2019 - |
Question
Alors avant d'exécuter git commit
je souvent exécutez la commande suivante:
git grep --cached -l -I "debugger"
Je pensais que c'était semblable à:
git diff --cached
(qui vous montrera tous les changements que vous êtes sur le point de commettre, à savoir. Vous montrer la diff dans vos fichiers mis en scène).
Malheureusement, je viens de découvrir que l'option --cached
pour git grep
indique simplement git à regarder « seulement » à tout dans son index.
Alors, comment puis-je exécuter git grep
et ont seulement grep mes dossiers 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 à travers mes fichiers mis en scène.)
La solution
Si vous avez un shell de type Unix disponible, la réponse est assez simple:
git grep --cached "debugger" $(git diff --cached --name-only)
se déroulera git grep
sur la liste des fichiers mis en scène.
Autres conseils
Beaucoup de crochets pre-commit utilisent git diff-index --cached -S<pat> REV
pour trouver des changements qui ajouter ou supprimer un modèle particulier. Donc, dans votre cas, git diff-index --cached -Sdebugger HEAD
. Vous pouvez ajouter -u
pour obtenir une diff aussi bien, sinon il identifie simplement le fichier incriminé.
Vous devez d'abord obtenir une liste des fichiers de l'index (à l'exception des fichiers supprimés). Cela peut être fait avec ce qui suit:
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 le indice actuel (mis en scène mais pas encore engagé) voir gitrevisions manuel 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
est ici un exemple d'un git pre-commit hook qui utilise cette méthode pour vérifier que les années de droit d'auteur sont à jour dans les fichiers à engager.