2015-11-12 10 views
9

Ho un vecchio commit md5hash su myfile.extension con SOME CHANGE nel corpo del commit (non il titolo di commit/metadati).Blocco di codice di tracciamento Git spostato/rimosso in un file

Come si genera un elenco di commit con SOME CHANGE modificata (non solo presente) nei commit che portano al HEAD da md5hash senza dover ispezionare ogni diff? (di cui ci sono purtroppo molti nel caso corrente)

Ho provato git rev-list --all | xargs git grep 'SOME CHANGE' ma questo sembra trovare tutti i commit con SOME CHANGE che è nel file.

git blame sembra inutile in quanto le linee sono cambiate e SOME CHANGE si è spostato.

risposta

4

Penso che la risposta che stai cercando sia git --no-pager log --pretty="%H" -G"SOME CHANGE" -- myfile.extension.

Inizialmente ho pensato a git log -S ma copre solo aggiungi/rimuovi. git log -G sarebbe probabilmente vicino a quello che vuoi. Qui puoi vedere la differenza tra -S e -G e ho incluso anche la cronologia completa del commit in modo da poter vedere ciò che non è coperto. Leggi i messaggi di commit per una descrizione di ciò che ho fatto nel corpo.

# git --no-pager log --oneline -S"SOME CHANGE" 
12e24ed Remove text 
9427ffc Add the text 
# git --no-pager log --oneline -G"SOME CHANGE" 
12e24ed Remove text 
6a33653 Change other text on same line 
ac09bbb Append other text to same line 
484b447 Move the text two lines down 
9427ffc Add the text 
# git --no-pager log --oneline 
12e24ed Remove text 
9c7f7d5 Change text on adjacent line 
6a33653 Change other text on same line 
ac09bbb Append other text to same line 
484b447 Move the text two lines down 
377936f Add other text on adjacent line 
9427ffc Add the text 
1929648 Initial commit 

Per farlo con solo gli hash:

# git --no-pager log --pretty="%H" -G"SOME CHANGE" 
12e24ed749e499bc2d8920c5d8a3ca98a6422e3f 
6a336532210ca85dea86968c34cef516345b8ab4 
ac09bbb5c95bbea65e7c99c730653d27f90397f4 
484b4478e4cb16c839dac558f3e958683b428a64 
9427ffc7dd60a3cfb1d9880083e6262faea0eefb 
0

Ciò richiederebbe comunque un po 'di guadare attraverso i risultati, ma questo potrebbe arrivare più vicino:

git rev-list --all | xargs git show | egrep '(^ ?[+-].*(SOME CHANGE)|^commit)' | egrep -B1 '^ ?[+-]' | uniq 

Questo mostra la patch per ogni commit, mostra la sha sta guardando, e poi sputa fuori la linea del codice che corrisponde. Lo sha appropriato per la partita è superiore alla partita.

Si potrebbe ulteriormente la pipeline per ripulire i risultati ancora di più se questa è una strada percorribile.

0

Penso che si sta cercando:

git log -S<string> 

cercare le differenze che cambiano il numero di occorrenze della stringa specificata (vale a dire oltre/delezione) in un file. Destinato all'uso dello scripter.

È utile quando si cerca un blocco di codice esatto (come una struttura) e si desidera conoscere la cronologia di quel blocco da quando è stato creato: utilizzare la funzione iterativamente per alimentare l'interessante blocco in il pre-imaging torna in -S e continua fino a quando non ottieni la prima versione del blocco.

Problemi correlati