tutorial - guida git pdf




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

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.


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?


Con Mercurial fai a

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

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


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

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=<foo> --grep=<bar> (o git log --author=<foo> --grep=<bar> 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=<foo> --grep=<bar> 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 <regexp> ) 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.


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.


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 <commit>.

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).


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


È possibile 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 <regexp> per trovare quando è stata spostata una riga contenente <regexp>, 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.







mercurial