2010-10-08 25 views
19

Quiero sacar una función de un archivo y ponerlo en otro, pero mantener el historial de culpa.Mantener el historial de git al dividir un archivo

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 

Pero si me quedo git blame b.php sólo veo que culpar a este nuevo compromiso.

Respuesta

4

Tal vez esto anterior SO pregunta podría ser informativo:

How does git track source code moved between files?

Parafraseando la respuesta aceptada: esencialmente, Git en realidad no "tienda" código movió; cuando se generan cosas como culpa de código movido, se hace ex post facto al examinar el estado de todo el repositorio desde el compromiso hasta la confirmación.

+0

esta pregunta suena como un "no", pero en realidad se trata de un "a veces". La eliminación parece ser lo que hace que Git busque en un archivo el historial más allá de otros archivos de fechas de nacimiento. Dividir una función pero conservar el resto de un archivo como OP no podría funcionar. Pero simplemente dividí un archivo por la mitad, borré el original y le di dos nuevos nombres, y la culpa es asignada correctamente en ambos archivos nuevos. – Potatoswatter

+0

Woops, eso fue solo después de la edición. Después de cometerlo aparentemente perdió la culpa de uno de los nuevos archivos. ¿Todavía es posible que tal vez? – Potatoswatter

5

tratar git blame -C -C b.php

+0

Quiero que el historial culpe a las confirmaciones más antiguas. Usamos git-svn para que otros estén en svn. –

+0

Lástima. ¡SVN no es compatible con esto, en absoluto! – Arafangion

+0

súper útil, TX .. ​​no se las arreglan para encontrar una solución para 'git log' todavía – ptim

13

La regla general para mantener la historia de la culpa es hacer un movimiento independiente comprometen primero antes de cualquier edición. Según mi experiencia, esto permite que git blame funcione sin la necesidad de la opción -C. Así, en el caso de dividir el archivo arriba en nuevos archivos, esto puede hacerse de dos confirmaciones:

  1. duplicado del original a los nuevos destinos, asegurándose de eliminar el original
  2. Retire las secciones adicionales de la archivos duplicados

En el ejemplo dado, esto sería:

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

El comportamiento de' add' git en un archivo que no existe cambiado en algún momento alrededor de Git 1.9. Necesita ya sea 'git rm' o' git add -A' para reflejar los archivos eliminados. –

+0

Gracias por el comentario @DamianYerrick. No creo que debería importar de ninguna manera si especificas los archivos exactos para escenificar. (El cambio fue que, a partir de git 2.0, "' git add 'es el mismo que' git añadir -A '" en que incluye el traslado de acuerdo con las notas de la versión [] (https: //git.kernel. org/cgit/git/git.git/plain/Documentation/RelNotes/2.0.0.txt)). – vine77

Cuestiones relacionadas