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 siano meno di 5 righe rispetto alla 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 parole per rintracciare le modifiche (cerca nella cronologia dei file).

Se si desidera trovare tutti i commit in cui il messaggio di commit contiene la parola data, utilizzare

 $ git log --grep=word 

Se vuoi trovare tutti i commit in cui “word” è stata aggiunta o rimossa nel contenuto del file (per essere più precisi: dove il numero di occorrenze di “parola” è cambiato), cioè cerca i contenuti del commit , usa la cosiddetta ricerca “piccone” con

 $ git log -Sword 

Nel git moderno c’è anche

 $ git log -Gword 

cercare le differenze la cui riga aggiunta o rimossa corrisponde a “parola” (anche i contenuti di commit ).

Si noti che -G di default accetta --pickaxe-regex , mentre -S accetta una stringa, ma può essere modificata per accettare --pickaxe-regex usando – --pickaxe-regex .

Per illustrare la differenza tra -S --pickaxe-regex e -G , 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).

Il piccone di git log troverà dei commit con le modifiche che includono “word” con git log -Sword

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 colors che mostrano le parole aggiunte e rimosse.

 git log --pickaxe-regex -p --color-words -S "" 

Prende un po ‘per correre però … 😉

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

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.

Per utilizzare il connettore booleano sull’espressione regolare:

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

Questa ricerca di espressioni regolari per le espressioni regolari [0-9] * o [az] * sui messaggi di commit.

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

Usa :Ggrep per farlo. Per maggiori informazioni puoi installare vim-fugitive e cercare il turorial da :help Grep . E questo episodio: esplorare-la-storia-di-un-git-repository ti guiderà a fare tutto ciò.

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

Ecco il succo dell’articolo:

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 

Consultare la documentazione di BFG Repo-Cleaner per l’utilizzo completo e le istruzioni di download.