2011-08-22 27 views
85

Utilizzando git, come posso cercare all'interno di tutti i file di tutte le filiali locali per una determinata stringa?Usando git, come posso cercare una stringa su tutti i rami?

Github specifico: è possibile eseguire la ricerca sopra in tutti i rami github? (Ci sono diverse filiali remote sul mio repo github remoto che idealmente non avrei dovuto abbattere per questa ricerca ..)

+1

[git-grep] (http://www.kernel.org/pub/software/scm/git/docs/git-grep.html) potrebbe essere quello che stai cercando, ma non sono ancora sicuro quale opzioni di cui avresti bisogno ... – johnny

+0

Possibile duplicato di [Come eseguire il grep (search) codice commit nella cronologia git?] (https://stackoverflow.com/questions/2928584/how-to-grep-search-committed- code-in-the-git-history) – nekketsuuu

risposta

94

È possibile farlo su un repo Git:

git grep "string/regexp" $(git rev-list --all) 

Github ricerca avanzata ha la capacità di ricerca del codice:

La ricerca del codice controllerà tutto il codice ospitato pubblicamente su GitHub. È inoltre possibile filtrare per:

  • la lingua: language:
  • il nome del repository (compreso il nome utente): repo:
  • il percorso del file: path:
+0

Questo mi provoca un errore di segmentazione. Potrebbe essere tortoisegitmerge (Windows), però. – bean5

+1

Questo non è davvero il modo migliore per farlo. Non controlla la quantità di git ref che vengono passati a 'git grep ...'. Guarda alle altre risposte, sono molto meglio di questo anche se è contrassegnato come la risposta accettata! – slm

+0

sarebbe fantastico se tu possa aggiungere un esempio per i tuoi filtri, ad es. 'percorso:', perché la documentazione a prima vista non sembra chiara dove applicare questo filtro, assumendo prima le virgolette nell'esempio di query? – blamb

61

Se si utilizza @manojlds grep git comando e ottieni un errore:

-bash: /usr/bin/git: Argument list too long" 

allora dovresti SE xargs:

git rev-list --all | xargs git grep "string/regexp" 

vedere anche How to grep (search) committed code in the git history?

+0

Inoltre, questo sembra essere più compatibile con altri tipi di console come il guscio di pesce – Daniel

+0

Grazie !!! usando ZSH e questo ha funzionato mentre il comando @manojlds ha dato l'errore che hai menzionato! Ma attenzione, questo può richiedere molto tempo per un grande repo con una lunga storia. – lacostenycoder

22

In molti casi git rev-list --all può restituire un numero enorme di commit che prendono per sempre per la scansione. Se invece di cercare attraverso ogni commit su ogni ramo della cronologia del tuo repository desideri cercare tutti i suggerimenti di ramo, puoi sostituirlo con git show-ref --heads. Quindi, in totale:

git grep "string" `git show-ref --heads` 

o:

git show-ref --heads | xargs git grep "string" 

Suggerimento: È possibile scrivere output in file da visualizzare in editor.

nano ~/history.txt 
git show-ref --heads | xargs git grep "search string here" >> ~/history.txt 
+3

'git show-ref --heads' elenca l'hash e il nome ref in modo che (2a riga) effettui la ricerca due volte. quindi 'git show-ref --heads | cut -d '' -f2' è migliore in quanto elencherà solo i nomi dei ref. – hIpPy

+1

Non riesco a credere a quante volte questa domanda è stata fatta e ha risposto, eppure tu sei l'unica con la risposta * corretta *. – Sammitch

+0

'git show-ref --heads -s' restituisce solo l'hash SHA1. Inoltre, se ci sono più diramazioni che puntano allo stesso commit, avrai duplicati. Puoi rimuoverli con 'sort -u', ad esempio' git show-ref --heads -s | ordina -u | xargs git grep ... ' – Steve

6

Ci sono pochi problemi con le soluzioni elencate qui (anche accettate).

  1. Non è necessario elencare tutti gli hash come si otterranno i duplicati, inoltre ci vuole più tempo.

Esso si basa su questo, dove è possibile cercare una stringa "test -f /" su più rami master e dev come

git grep "test -f /" master dev 

che è lo stesso

printf "master\ndev" | xargs git grep "test -f /" 

va così qui.

Questo trova gli hash per la punta di tutti i rami locali e cerca solo in quei commit.

git branch -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp" 

Se avete bisogno di cercare nelle filiali remote troppo quindi aggiungere -a:

git branch -a -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp" 

Aggiornamento:

# search in local branches 
git branch | cut -c3- | xargs git grep "string" 
# search in remote branches 
git branch -r | cut -c3- | xargs git grep "string" 
# search in all (local and remote) branches 
git branch -a | cut -c3- | xargs git grep "string" 

# search in branches, and tags 
git show-ref | grep -v "refs/stash" | cut -d' ' -f2 | xargs git grep "string" 
+1

almeno per la ricerca in tutte le filiali dovrebbe essere: ' git branch -a | cut -c3- | cut -d '' -f 1 | xargs git grep "string" ' o non funzionerà con il simbolo' -> 'nella lista dei file, che denota la relazione tra locale e remoto –

0

si può provare questo

git log -Sxxxx #search all commits 
git log -Sxxxx --branches[=<pattern>] #search branches 
Problemi correlati