Come cercare tutti i commit Git e Mercurial nel repository per una determinata stringa?

Ho un repository Git con poche filiali e commit penzolanti. Mi piacerebbe cercare tutti questi commit nel repository per una stringa specifica.

So come ottenere un registro di tutti i commit nella cronologia, ma questi non includono rami o blob penzolanti, solo la storia di HEAD. Voglio averli tutti, per trovare un impegno specifico che è stato perso.

Mi piacerebbe anche sapere come farlo in Mercurial, come sto considerando il passaggio.

È ansible vedere i commit penzolanti con git log -g .

 -g, --walk-reflogs Instead of walking the commit ancestry chain, walk reflog entries from the most recent one to older ones. 

Quindi puoi farlo per trovare una stringa particolare in un messaggio di commit che penzola:

 git log -g --grep=search_for_this 

In alternativa, se vuoi cercare le modifiche per una particolare stringa, puoi usare l’opzione di ricerca del piccone, “-S”:

 git log -g -Ssearch_for_this # this also works but may be slower, it only shows text-added results git grep search_for_this $(git log -g --pretty=format:%h) 

Git 1.7.4 aggiungerà l’opzione -G , consentendo di passare -G per trovare quando è stata spostata una riga contenente , che -S non può fare. -S ti dirà solo quando il numero totale di righe contenenti la stringa è cambiato (cioè aggiungendo / rimuovendo la stringa).

Infine, puoi usare gitk per visualizzare i pegni pendenti con:

 gitk --all $(git log -g --pretty=format:%h) 

E poi usa le sue funzionalità di ricerca per cercare il file fuori posto. Tutti questi lavori presuppongono che il commit mancante non sia “scaduto” e sia stato garbage collocato, cosa che potrebbe accadere se penzola per 30 giorni e si scadono i reflog o si esegue un comando che li espande.

In Mercurial usi hg log --keyword per cercare parole chiave nei messaggi di commit e hg log --user per cercare un particolare utente. Vedi hg help log per altri modi per limitare il registro.

In aggiunta alla risposta richq dell’uso di git log -g --grep= o git grep -e $(git log -g --pretty=format:%h) : dai un’occhiata ai seguenti post del blog di Junio ​​C Hamano, attuale manutentore di git

  • Divertimento con “git log –grep”
  • Divertirsi con “git grep”

Sommario

Sia git grep che git log –grep sono orientati alla linea , in quanto cercano le linee che corrispondono al modello specificato.

Puoi usare git log --grep= --grep= (o git log --author= --grep= che si traduce internamente in due --grep ) per trovare commit che abbinare uno dei modelli (implicito OR semantico).

Essendo orientato alla linea, l’utile semantica di AND è usare git log --all-match --grep= --grep= per trovare il commit che ha sia la corrispondenza della linea che la corrispondenza della prima riga da qualche parte.

Con git grep puoi combinare più pattern (tutti che devono utilizzare il modulo -e ) con – --or (che è il valore predefinito), --and , --and --not , ( e ) . Per grep --all-match significa che il file deve avere linee che corrispondono a ciascuna delle alternative.

Basandosi sulla risposta di rq, ho trovato che questa linea fa quello che voglio:

 git grep "search for something" $(git log -g --pretty=format:%h -S"search for something") 

Quale riferirà l’ID di commit, il nome del file e visualizzerà la linea corrispondente, in questo modo:

 91ba969:testFile:this is a test 

… Qualcuno è d’accordo sul fatto che questa sarebbe una buona opzione da includere nel comando standard git grep?

Qualsiasi comando che accetta riferimenti come argomenti accetterà l’opzione --all documentata nella pagina man per git rev-list come segue:

  --all Pretend as if all the refs in $GIT_DIR/refs/ are listed on the command line as . 

Quindi, ad esempio git log -Sstring --all mostrerà tutti i commit che menzionano string e che sono accessibili da un ramo o da un tag (presumo che i tuoi commit penzolanti siano almeno nominati con un tag).

Con Mercurial fai a

 $ hg grep "search for this" [file...] 

Ci sono altre opzioni che restringono la gamma di revisioni che vengono cercate.

Non so di git, ma in Mercurial avrei solo collegato l’output di hg log ad uno script di tipo sed / perl / qualunque per cercare quello che stai cercando. Puoi personalizzare l’output di hg log usando un modello o uno stile per rendere più facile la ricerca, se lo desideri.

Ciò includerà tutte le filiali nominate nel repository. Mercurial non ha qualcosa di simile a blob penzoloni afaik.

se sei un utente Vim, puoi installare tig (apt-get install tig) e usare /, lo stesso comando per cercare su vim

https://blogs.atlassian.com/2013/05/git-tig/

Per aggiungere solo un’altra soluzione non ancora menzionata, ho dovuto dire che usare la casella di ricerca grafica di gitg era la soluzione più semplice per me. Seleziona la prima occorrenza e puoi trovare la successiva con Ctrl-G.

Un comando in git che penso sia molto più facile trovare una stringa:

 git log --pretty=oneline --grep "string to search" 

funziona in Git 2.0.4