2009-11-17 4 views
5

Est-ce que je ne comprends pas comment fonctionne git grep --cached foo? Exécution git version 1.6.4.4 ou 1.6.5.2, git grep --cached foo renvoie exactement la même chose que git grep foo.git grep --cache

Je pensais que cela fonctionnerait comme git diff --cached, en recherchant uniquement les changements dans la zone de transit. C'est certainement ce que le man page me porte à croire:

git diff [--options] --cached [<commit>] [--] [<path>…] 

Ce formulaire est pour afficher les modifications que vous avez mis en scène pour la prochaine validation par rapport au nom <commit>. En règle générale, vous voulez comparer avec la dernière validation, donc si vous ne donnez pas <commit>, la valeur par défaut est HEAD. Si HEAD n'existe pas (, par exemple, branches non acquises) et <commit> n'est pas indiqué, il montre toutes les modifications par étapes. --staged est un synonyme de --cached.

Est-ce juste un bogue, ou existe-t-il un moyen alternatif/meilleur pour trouver les changements sur le point d'être commis qui mentionnent foo?

git diff --cached | grep foo 

La commande me donne la moitié de ce que je veux ci-dessus, mais il perd que le contexte de fichier le changement apparaît dans.

MISE À JOUR

Il semble que j'ai une erreur de concept ce que --cached regarde. Il semble qu'il cherche l'état de l'arbre en supposant que la zone de transit est appliquée. Cela a du sens, maintenant que j'y pense. Ce que je veux pour chercher dans est la différence, pas l'arbre complet. Plus précisément, je veux savoir la liste de tous les fichiers (je ne me soucie pas des numéros de ligne ou de contexte) que je suis sur le point de commettre SpecialLog(...), donc je peux aller éditer ces fichiers et supprimer SpecialLog. Donc oui, je peux juste faire git diff --cached et chercher dans le pager pour SpecialLog, mais alors pour les changements énormes dans un seul fichier, il y a beaucoup de doublons et ce n'est pas évident quel fichier je regarde.

Répondre

9
$ git init 
Initialized empty Git repository in /tmp/foo/.git/ 
$ echo hi there >file 
$ git add file 
$ git commit -m 'added file' 
[master (root-commit) dc08993] added file 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 file 
$ echo hi again >>file 
$ git grep again 
file:hi again 
$ git grep --cached again 
$ 

temps passe ...

$ git add file 
$ git grep --cached again 
file:hi again 

Pour limiter la portée de votre recherche sur le contenu du prochain commit, git diff tuyaux sa sortie à $PAGER. En supposant que vous avez défini votre pager sur less, git diff --cached montre les résultats de la recherche dans le contexte.

Recherche dans l'index des fichiers avec des changements qui mentionnent une chaîne spéciale comme dans l'exemple suivant:

$ echo SpecialLog >file2 
$ git add file2 
$ git diff-index --cached --name-only HEAD 
file 
file2 
$ git diff-index --cached -SSpecialLog --name-only HEAD 
file2 
$ git diff --cached -SSpecialLog --name-only 
file2 
+0

Merci. Vous m'avez aidé à comprendre mon erreur de concept (voir mise à jour dans la description). Donc, ce que je cherche vraiment, c'est quelque chose qui combine git diff et grep. Le pager fonctionne, mais ce n'est pas ce que je cherche;) –

+0

Voir la mise à jour. –

+0

Doux! C'est exactement ce que je voulais! –