2013-01-07 12 views
16

Dopo molte ricerche, non ho trovato un metodo soddisfacente che sia facile da usare per visualizzare la cronologia completa di un file spostato in Git e, cosa più importante in Gitk. Usando "git log --follow [filePath]" e anche "gitk --follow [filePath]" ti dà il commit del fatto che il file è stato coinvolto ma non ti mostrerà la cronologia delle modifiche effettive del file prima dello spostamento. Ho quindi trovato una soluzione semplice ma semplice.Utilizzo di gitk per visualizzare la cronologia completa di un file spostato

  1. Fare una gitk sul file che è stato spostato: "gitk [newFilePath]". Copia l'ID SHA1 del primo commit, questo dovrebbe essere il commit in cui il file è stato spostato.
  2. Esegui una gitk sull'ID SHA1 copiato: "gitk [SHA1ID]". L'ultimo commit dovrebbe essere quando la mossa è avvenuta. Trova il file spostato e copia il vecchio percorso.
  3. fare un gitk sul ID SHA1 abbiamo appena copiato e il vecchio percorso del file: “gitk [SHA1ID] - [oldFilePath]”

Questo processo permetterà di visualizzare la cronologia del file prima della mossa. Se ci sono state mosse multiple, il processo di cui sopra può essere ripetuto.

Se esistono soluzioni migliori a questo problema, soprattutto se è possibile combinare questi passaggi per visualizzare l'intera cronologia con le mosse, sarebbe molto apprezzato.

risposta

7

Se volete vedere i cambiamenti che è stato fatto in ogni commit anche il file è stato rinominato, è possibile utilizzare l'opzione -p di git log:

git log -p --follow [file/with/path] 
+0

Questa è una soluzione eccellente! Non ho mai visto la soluzione di qualcun altro usare l'opzione -p con "git log --follow" prima.Sarebbe preferibile vederlo in gitk ma userò sicuramente questo metodo! –

+0

Se sei (ancora) alla ricerca di un modo GUI per farlo - prova SourceTree (link nella mia risposta) – Chris

3

Ecco una funzione bash che dovrebbe mostrare la storia di un file (utilizzando gitk) in tutte le sue incarnazioni ... lascio come esercizio per il lettore se ne hanno bisogno per un altro shell:

# bash 
gitk_follow() { 
    while (("$#")); do 
    git log --oneline --name-status --follow $1; 
    shift; 
    done | perl -ne 'if(s{^(?:[ACDMRTUXB]|R\d+)\s+}{}) { s{\s+}{\n}g; print; }' | sort -u 
} 

# used as: 
gitk $(gitk_follow some_file) 

aggiornamento:

Cambiato per usare perl perché non ho prestato abbastanza attenzione all'output da git log nell'ultima versione.

+0

Molto bello, grazie! Ho dovuto usarlo con un '--', però:' gitk - $ (gitk_follow some_file) '. –

0

Un'altra alternativa è utilizzare l'applicazione SourceTree (GUI) sviluppata da Atlassian. All'interno dell'applicazione è possibile fare clic con il pulsante destro del mouse sul file e selezionare "Registro selezionato ..."

Log Selected.

Nella finestra pop-up che poi permette di "seguire file rinominati":

enter image description here

Io uso anche GitHub for Mac, ma non ho visto quel tipo di funzionalità in là, ancora.

(Io non sono affiliato con uno di loro!)

+0

non c'è alcuna variante Linux disponibile per questo? –

0

Una funzione semplice utilizzando diverse opzioni di registro git e awk di esigere i nomi dei file (e il "-" che gitk ha bisogno è incluso):

# bash 
gitk_follow() { 
    while (("$#")); do 
    git log --pretty="" --name-status --follow $1; 
    shift; 
    done | awk '{print $NF}' | sort -u 
} 

# used as: 
gitk -- $(gitk_follow some_file) 
Problemi correlati