139 votes

Comment exclure certains répertoires / fichiers de la recherche git grep

Est-il possible de rechercher le référentiel git en utilisant git grep mais d'exclure certains chemins / répertoires / fichiers de la recherche? Comme pour l’option --exclude dans la commande grep normale.

Si vous êtes curieux: je ne veux pas utiliser grep normal car il est beaucoup plus lent que git grep lorsque la taille du référentiel git est grande.

62voto

kynan Points 2334

Cela peut sembler arriéré, mais vous pouvez passer une liste de fichiers ne correspondant pas à votre modèle d'exclusion à git grep comme ceci:

 git grep <pattern> -- `git ls-files | grep -v <exclude-pattern>`
 

grep -v renvoie tous les chemins ne correspondant pas <exclude-pattern> . Notez que git ls-files prend également un paramètre --exclude , mais cela ne s'applique qu'aux fichiers non suivis .

18voto

CharlesB Points 27070

Ce n'est pas possible, mais a été discuté récemment . Solution de contournement proposée dans le lien:

Vous pouvez mettre *.dll dans le fichier .gitignore, puis git grep --exclude-standard .

2voto

UlfR Points 677

Avec l'exemple de @kynan comme base j'ai fait ce script et le mettre dans mon chemin (~/bin/) gg. Il n'utilisez git grep mais évite certains types de fichiers.

Dans notre repo son beaucoup d'images donc j'ai exclu les fichiers images, et cela prend la serchtime vers le bas pour 1/3 si je recherche l'ensemble des pensions. Mais le script peut facilement être modifié pour exclure d'autres filestypes ou geleralpatterns.

#!/bin/bash                                                                    
#                                                                              
# Wrapper of git-grep that excludes certain filetypes.                         
# NOTE: The filetypes to exclude is hardcoded for my specific needs.           
#                                                                              
# The basic setup of this script is from here:                                 
#   http://stackoverflow.com/a/14226610/42580                                  
# But there is issues with giving extra path information to the script         
# therefor I crafted the while-thing that moves path-parts to the other side   
# of the '--'.                                                                 

# Declare the filetypes to ignore here                                         
EXCLUDES="png xcf jpg jpeg pdf ps"                                             

# Rebuild the list of fileendings to a good regexp                             
EXCLUDES=`echo $EXCLUDES | sed -e 's/ /\\\|/g' -e 's/.*/\\\.\\\(\0\\\)/'`      

# Store the stuff that is moved from the arguments.                            
moved=                                                                         

# If git-grep returns this "fatal..." then move the last element of the        
# arg-list to the list of files to search.                                     
err="fatal: bad flag '--' used after filename"                                 
while [ "$err" = "fatal: bad flag '--' used after filename" ]; do              
    {                                                                          
        err=$(git grep "$@" -- `git ls-files $moved | grep -iv "$EXCLUDES"` \  
            2>&1 1>&3-)                                                        
    } 3>&1                                                                     

    # The rest of the code in this loop is here to move the last argument in   
    # the arglist to a separate list $moved. I had issues with whitespace in   
    # the search-string, so this is loosely based on:                          
    #   http://www.linuxjournal.com/content/bash-preserving-whitespace-using-set-and-eval
    x=1                                                                        
    items=                                                                     
    for i in "$@"; do                                                          
        if [ $x -lt $# ]; then                                                 
            items="$items \"$i\""                                              
        else                                                                   
            moved="$i $moved"                                                  
        fi                                                                     
        x=$(($x+1))                                                            
    done                                                                       
    eval set -- $items                                                         
done                                                                           
# Show the error if there was any                                              
echo $err                                                                      

Note 1

En fonction de ce qu'il devrait être possible de nommer la chose, git-gg et être capable de l'appeler régulièrement la commande git comme:

$ git gg searchstring

Mais je ne peux pas obtenir ce travail. J'ai créé le script dans mon ~/bin/ et fait un l' git-gg lien symbolique en /usr/lib/git-core/.

Note 2

La commande ne peut pas être fait en une régulières sh git-alias, car il sera alors appelée à la racine de l'opération. Et ce n'est pas ce que je veux!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X