2010-10-08 16 views
19

Voglio estrarre una funzione da un file e inserirla in un'altra, mantenendo la cronologia della colpa.Mantieni cronologia git quando si divide un file

cp a.php b.php 

vim b.php 
# delete everything but 1 function 

vim a.php 
# delete the 1 function 

git add a.php b.php 
git commit 

Ma se corro git blame b.php Vedo solo che la colpa a questo nuovo impegno.

risposta

4

Forse questa domanda precedente SO potrebbe essere informativo:

How does git track source code moved between files?

Parafrasando la risposta accettata: in sostanza, Git in realtà non "store" si trasferisce il codice; quando si generano elementi come la colpa per il codice spostato, viene effettuato ex post facto esaminando lo stato dell'intero repository da commit a commit.

+0

questa risposta suona come un "no", ma in realtà si tratta di un "a volte." L'eliminazione sembra essere ciò che fa scattare Git a guardare un file per la cronologia oltre la data di nascita di altri file. Separare una funzione ma mantenere il resto di un file come OP potrebbe non funzionare. Ma ho diviso un file a metà, cancellando l'originale e dandogli due nuovi nomi, e la colpa è correttamente assegnata in entrambi i nuovi file. – Potatoswatter

+0

Woops, è stato solo dopo la modifica. Dopo aver commesso, apparentemente ha perso la colpa per uno dei nuovi file. Forse forse un forse? – Potatoswatter

5

provare git blame -C -C b.php

+0

Voglio che la cronologia in realtà sia la colpa dei vecchi commit. Usiamo git-svn quindi altri saranno su svn. –

+0

Peccato. SVN non supporta questo, affatto! – Arafangion

+0

super utile, tx .. non sono riuscito a trovare una soluzione per 'git log' ancora – ptim

13

La regola generale per mantenere la storia colpa è di fare una mossa separata commettere prima di qualsiasi modifica. È stata la mia esperienza che consente a git blame di funzionare senza la necessità dell'opzione -C. Quindi, nel caso di dividere il file fino in nuovi file, questo può essere fatto in due commit:

  1. duplicare l'originale per le nuove destinazioni, avendo cura di eliminare l'originale
  2. Rimuovere le sezioni in più dalla file duplicati

nell'esempio fornito, questo sarebbe:

cp a.php b.php 
mv a.php c.php 
git add a.php b.php c.php 
git commit 
vim b.php # delete everything but 1 function 
vim c.php # delete the 1 function 
git add b.php c.php 
git commit 
+0

Il comportamento di' git add' su un file inesistente è cambiato in Git 1.9. Hai bisogno di 'git rm' o' git add -A' per riflettere i file rimossi. –

+0

Grazie per il commento @DamianYerrick. Non credo che dovrebbe essere importante in entrambi i casi se si specificano i file esatti per lo stage. (Il cambiamento era che, a partire da git 2.0, "' git add 'è lo stesso di' git add -A '" in quanto include le rimozioni in base alle [note di rilascio] (https: //git.kernel. org/CGIT/git/git.git/plain/Documentation/file RELNOTES/2.0.0.txt)). – vine77

Problemi correlati