Perché git log potrebbe non mostrare la cronologia per un file spostato e cosa posso fare al riguardo?


90

Ho rinominato un paio di file usando git mv, usato git stash, ho dato una rapida occhiata a HEAD (senza cambiarlo) e poi l'ho fatto git stash popper recuperare l'intero lotto. Le mie mosse erano scomparse dall'elenco dei commit, quindi le ho ripetute con git rme il messaggio di commit ha affermato che git aveva notato che la ridenominazione era una rinomina. Quindi non ci ho più pensato.

Ma ora, dopo il commit, non riesco ad accedere alla cronologia dei file spostati! Ecco cosa dice git del commit in questione:

~/projects% git log --summary
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.h
 delete mode 100644 test/R_DebugUI_iOS.m
 create mode 100644 system/runtime/src/R_DebugUI_iOS.h
 create mode 100644 system/runtime/src/R_DebugUI_iOS.m

 <<snip older commits>>
 ~/projects%

Ora sto cercando di ottenere la cronologia di uno di questi file spostati, quindi posso guardare una vecchia versione, ma non ottengo nulla di molto utile:

~/projects/system/runtime/src% git log --follow --find-copies-harder -M -C R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime
~/projects/system/runtime/src% 

(L'ho provato anche senza -M, -Ce --find-copies-harder, ma senza alcun risultato.)

Posso ottenere la sua cronologia con il suo vecchio nome, che si ferma nel punto in cui è stato cancellato dalla vecchia posizione:

~/projects% git log --summary --follow --find-copies-harder -M -C -- test/R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.m

commit 32a22d53c27e260714f759ecb3d3864e38b2e87f
Author: brone
Date:   Tue Dec 7 23:52:51 2010 +0000

    Can set debug UI's alpha.

<<snip older commits>>
~/projects%

Quindi questa volta non sono completamente bloccato, ma non mi piacerebbe dover fare questo genere di cose tutto il tempo. (Prevedo di avere un discreto numero di file che verranno spostati almeno una volta nella vita.)

Sto facendo qualcosa di sbagliato? La vecchia copia del file e la nuova copia sono identiche al 98,8% (2 righe su 166 modificate). La mia comprensione è che git dovrebbe essere in grado di tenere traccia del file in questo caso, perché deduce le operazioni di rinomina piuttosto che memorizzarle esplicitamente, ei file sono abbastanza simili da ritenere che dovrebbe considerarli uguali.

C'è qualcosa che posso fare per risolvere questo problema?


Indovina: funziona se esegui il comando all'interno di ~ / projects / invece di ~ / projects / system / runtime / src?
Douglas

No, ottengo lo stesso risultato. (In genere git sembra abbastanza buono per lasciarti comunque in qualsiasi cartella ...)

Questo però mi ha dato un'idea e ho aggiornato la domanda con le mie scoperte. Grazie per il commento!

sto usando "tortoiseGit 1.5.8.0" insieme a "1.7.3.1.msysgit.0" su mswindows. Quando rinomino + effettuo il commit di un file in explorer vedo nella mia gui "status = Rename". Non so abbastanza su git come eseguire questa operazione nella riga di comando per rispondere "come farlo" ma tortoiseGit ha fatto qualcosa per me che ha funzionato come ti aspettavi.
k3b

Risposte:



28

Bene, vedo le mie ridenominazioni con git log -M --summary..


git log -M --summarynon fornisce alcuna informazione di ridenominazione se stai solo guardando la cronologia di un dato file, cioè con un argomento file.
vinc17

17

Rispondendo alla mia stessa domanda, poiché sono riuscito a placare le mie preoccupazioni, anche se non ho risolto esattamente il mio problema. ( git log --followcomunque non funziona per me.)

In primo luogo, il --summaryregistro per il commit di ridenominazione include la deleteriga con il vecchio nome del file. Quindi, se è facile da individuare, puoi trovare il suo vecchio nome e git logda lì.

Se fa parte di un commit di grandi dimensioni, e quindi un po 'più difficile da individuare - e questa situazione era una delle mie preoccupazioni - git blame -Cpuò essere utilizzato con il nuovo nome del file nella prima revisione post-rinomina. Presumibilmente rimangono delle righe dal file originale! - quindi git dovrebbe trovare la loro fonte e mostrare il vecchio nome del file (e un hash di commit per buona misura). È quindi possibile riprendere il sentiero con git log.

Quindi, se hai un certo interesse per la cronologia del file come unità (per qualsiasi motivo), allora sembra che possa essere fatto in modo relativamente semplice. Anche se ho l'impressione che preferirei che tu lo usassi correttamente.


6
Penso che tu abbia bisogno dell'opzione -M per mostrare effettivamente le rinomine piuttosto che eliminare / aggiungere di
Adrian Cornish

1
Ho appena avuto lo stesso problema e git log --follow .ho notato che la tua directory di lavoro fa la differenza dove la directory di lavoro è la nuova posizione non funziona, mentre git log --follow path/to/new/dir, eseguita da una directory genitore comune della vecchia e della nuova posizione, funziona
akraf

1
Il --followparametro funziona, ma devi fare:git log --follow -- ./path/to/file
DrumM

Ho appena avuto il problema che si git -log filename.csinterrompe al commit dello spostamento del file (la directory corrente è impostata sulla cartella del file). Tuttavia la finestra della cronologia di VS mostra l'intero registro delle modifiche ai file. Inoltre posso vedere che il file è stato spostato con il desktop Github. Ma git log -10 --follow filename.csmostra anche il registro prima del commit dello spostamento.
oleksa

11
git log --follow ./path/to/file

Credo che questo sia quello che stai cercando.


3
La risposta di cinque anni prima ha questa informazione.
dotancohen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.