log - git reset




Come invertire `git log--grep=<pattern>` o Come mostrare log git che non corrispondono a un pattern (6)

Come con la risposta di thebriguy, grep ha anche un'opzione -z per abilitarlo a lavorare con stringhe terminate null piuttosto che con linee. Questo sarebbe quindi semplice come invertire la partita:

git log -z --color | grep -vz "bumped to version"

Per motivi di sicurezza, si consiglia di associare solo il messaggio di commit. Per fare ciò con grep, è necessario utilizzare le espressioni perla per far corrispondere le nuove righe all'interno delle stringhe terminate da null. Per saltare l'intestazione:

git log -z | grep -Pvz '^commit.*\nAuthor:.*\nDate:.*\n[\S\s]*bumped to version'

O con il colore:

git log -z --color | \
  grep -Pvz '^.....commit.*\nAuthor:.*\nDate:.*\n[\S\s]*bumped to version'

Infine, se si utilizza --stat, si potrebbe anche abbinare l'inizio di questo output per evitare la corrispondenza dei nomi di file contenenti la stringa di commit. Quindi una risposta completa alla domanda sarebbe simile:

log -z --color --pretty --stat | \
  grep -Pvz '^.....commit.*\nAuthor:.*\nDate:.*\n[\S\s]*?bumped to version[\S\s]*?\n [^ ]'

Si noti che grep -P è descritto come "altamente sperimentale" nella mia pagina man. Potrebbe essere meglio usare invece pcregrep che usa libpcre, vedi Come dare un pattern per la nuova riga in grep? . Sebbene grep -P pcregrep bene per me e non ho idea se pcregrep abbia un'opzione -z o equivalente.

Voglio usare git log per mostrare tutti i commit che non corrispondono a un dato pattern. So che posso usare quanto segue per mostrare tutti i commit che corrispondono a un modello:

git log --grep=<pattern>

Come posso invertire il senso di corrispondenza?

Sto cercando di ignorare i commit che hanno "urtato alla versione ..." nel messaggio.

EDIT: voglio che il mio output finale sia piuttosto dettagliato. es. git log --pretty --stat . Quindi l'output di git log --format=oneline non funzionerà per me.


Come menzionato da VonC, l'opzione migliore è se è possibile aggiornare a Git 2.4.0 (che è attualmente su RC2). Ma anche se non puoi farlo non c'è alcun motivo per elaborare script. Un (gnu) awk one-liner dovrebbe farlo. git log ha l'opzione -z utile per separare commit da un carattere NUL che rende facile analizzarli:

git log -z --pretty --stat | awk 'BEGIN{ RS="\0"; FS="\n\n" } !match($2, /<pattern>/)'

Se non hai gnu awk, probabilmente dovresti installarlo almeno. Oppure porta questo script alla tua specifica versione di awk, che lascio come esercizio per il lettore ;-).


Per quanto posso dire, questo non è possibile fare direttamente con una singola riga di comando; dovresti fare qualcosa come suggerisce Justin Lilly e quindi eseguire 'git log' sulla lista risultante di hash, ad es.

git log --format="%h" | grep -v `git log -1 --grep="bumped to version" --format="%h"` > good-hashes
for h in `cat good-hashes`; do
    PAGER=cat git log -1 --pretty --stat $h
done

dovrebbe fare il trucco


Questo sarà possibile con github.com/git/git/blob/… : vedi commit 22dfa8a di Christoph Junghans ( junghans ) :

log : teach --invert-grep option

" git log --grep=<string> " mostra solo commit con messaggi che corrispondono alla stringa data, ma a volte è utile essere in grado di mostrare solo commit che non hanno determinati messaggi (es. "mostrami quelli che non sono FIXUP impegna ").

Inizialmente, avevamo grep_opt , la bandiera invert-grep , ma perché " git grep --invert-grep " non ha senso se non in congiunzione con " --files-with-matches ", che è già coperto da " --files-without-matches ", è stato spostato nella struttura delle revisioni.
Per avere la bandiera là esprime meglio la funzione per la caratteristica.

Quando i due nuovi test inseriti vengono eseguiti, la cronologia si impegna con i messaggi " initial ", " second ", " third ", " fourth ", " fifth ", " sixth " e " Second ", commessi in questo ordine.
I commit che non corrispondono a " th " o " Sec " sono " second " e " initial ". Per il caso insensibile solo le corrispondenze " initial ".

--invert-grep

Limita l'output di commit a quelli con messaggio di log che non corrispondono al pattern specificato con --grep=<pattern> .

Esempio:

Il primo messaggio in grep con "sequencer" in loro:

[email protected] C:\Users\vonc\prog\git\git

> git log -2 --pretty="tformat:%s" --grep=sequencer
Merge branch 'js/sequencer-wo-die'
sequencer: ensure to release the lock when we could not read the index

Se voglio messaggi senza sequencer:

> git log -2 --pretty="tformat:%s" --grep=sequencer --invert-grep
Second batch for 2.11
Merge branch 'js/git-gui-commit-gpgsign'

ottieni una lista di tutti i commit contenenti i tuoi risultati, quindi filtra gli hash.

git log --format=oneline | grep -v `git log --grep="bumped to version" --format="%h"`

git log --pretty --stat | grep -v "bumped to version"






git-log