risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come grep Git commit differenze o contenuti per una determinata parola?

In un repository di codice Git voglio elencare tutti i commit che contengono una determinata parola. Ho provato questo

git log -p | grep --context=4 "Word"

ma non mi restituisce necessariamente il nome del file (a meno che non sia meno di 5 righe lontano dalla parola che ho cercato.

git grep "Word"

ma mi dà solo i file presenti e non la storia.

Come faccio a cercare l'intera cronologia in modo da poter seguire le modifiche su una determinata parola? Intendo cercare nella mia base di codice le occorrenze di Word per rintracciare le modifiche (cerca nella cronologia dei file).

529

Se vuoi trovare tutti i commit in cui commit message contiene Word, usa

$ git log --grep=Word

Se vuoi trovare tutti i commit in cui "Word" è stato aggiunto o rimosso nel contenuto del file (per essere più precisi: dove il numero di occorrenze di "Word" è cambiato), cioè cerca i contenuti commit, usa la cosiddetta ricerca "piccone" con

$ git log -Sword

Nel git moderno c'è anche

$ git log -Gword

cercare differenze la cui riga aggiunta o rimossa corrisponde a "Parola" (anche commit contenuti).

Nota che -G accetta di default un'espressione regolare, mentre -S accetta una stringa, ma può essere modificata per accettare espressioni regolari usando --pickaxe-regex.

Per illustrare la differenza tra -S<regex> --pickaxe-regex e -G<regex>, considera un commit con la seguente diff nello stesso file:

+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

Mentre git log -G"regexec\(regexp" mostrerà questo commit, git log -S"regexec\(regexp" --pickaxe-regex non lo farà (perché il numero di occorrenze di quella stringa non è cambiato).

777
Jakub Narębski

Il piccone di git log troverà dei commit con modifiche tra cui "Word" con git log -Sword

246
u0b34a0f6ae

Dopo molti esperimenti, posso consigliare quanto segue, che mostra i commit che introducono o rimuovono le righe contenenti una determinata espressione, e visualizza le modifiche del testo in ciascuna, con i colori che mostrano le parole aggiunte e rimosse. 

git log --pickaxe-regex -p --color-words -S "<regexp to search for>"

Ci vuole un po 'per correre però ... ;-)

14
CharlesW

Un altro modo/sintassi per farlo è: git log -S "Word"
In questo modo è possibile cercare ad esempio git log -S "with whitespaces and stuff @/#ü !"

7
1u-

Puoi provare il seguente comando:

git log --patch --color=always | less +/searching_string

o usando grep nel modo seguente:

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'

Esegui questo comando nella directory superiore in cui desideri effettuare la ricerca.

7
kenorb

Per utilizzare il connettore booleano nell'espressione regolare:

git log --grep '[0-9]*\|[a-z]*'

Questa ricerca di espressioni regolari per l'espressione regolare [0-9] * o [a-z] * sui messaggi di commit.

2
Reudismam

vim-fugitive è versatile per quel tipo di esame in Vim. 

Usa :Ggrep per farlo. Per maggiori informazioni puoi installare vim-fugitive e cercare il codice da :help Grep. E questo episodio: explorer-the-history-of-a-git-repository ti guiderà a fare tutto questo.

2
lerner

Se vuoi cercare dati sensibili per rimuoverli dalla cronologia git (che è il motivo per cui sono arrivato qui), ci sono strumenti per questo. Github come una pagina di aiuto dedicata per quel problema

Ecco il Gist di questo articolo: 

Il BFG Repo-Cleaner è un'alternativa più veloce e più semplice a git filter-branch per la rimozione di dati indesiderati. Ad esempio, per rimuovere il tuo file con dati sensibili e lasciare intatto il tuo ultimo commit, esegui:

bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA

Per sostituire tutto il testo elencato in passwords.txt ovunque si trovi nella cronologia del tuo repository, esegui:

bfg --replace-text passwords.txt

Vedere la documentazione di BFG Repo-Cleaner per l'uso completo e le istruzioni di download.

0
edelans