2012-04-17 6 views
5

Considere los siguientes casos de uso:¿Cómo encontrar la nueva ruta de un archivo renombrado cuyo nombre original se conoce?

Estoy trabajando en mi sucursal local, mientras que la refactorización se ha realizado en la sucursal principal. Ahora algunos archivos (clases) han sido renombrados y/o movidos a nuevas ubicaciones. Cuando me fusiono, recibo muchos errores de importación debido a la falta de clases.

--A--B--C--D--E-- (master) 
    \   \ 
    F--G--H--I--J (topic) 

En A no son los nombres antiguos Wich i utilizado en F--G--H--I.

En B--C--D--E los archivos se refactorizan dando como resultado nuevos nombres de archivo en E. Esto incluye grupos de cadena renombra como

B: path/to/File.java    
-> C: path/to/BetterName.java 
-> D: better/package/BetterName.java 
-> E: final/package/FinalName.java 

Ahora se fusionan los resultados en J con muchos errores (compilación) debido a las refactorizaciones que faltan en mi rama. (Debido a que todavía se refieren a path.to.File en lugar de final.package.FinalName

el fin de solucionar la acumulación roto, necesito saber los nombres nuevos para las viejas clases.

¿Existe un comando git para obtener todos los cambios de nombre que tienen se ha aplicado a un archivo particular?

+0

funciona su guión? en caso afirmativo, no recibo su pregunta – CharlesB

+0

Sí, funciona, pero me preguntaba si existe una solución más simple que el script anterior. Como tengo que hacerlo para cada archivo. – helt

+0

Necesita decirle 'git log' para encontrar nombres con la opción' -M'. Entonces solo quieres reportar los cambios de nombre y eso se hace con la opción '--diff-filter'. He agregado más detalles a mi respuesta. –

Respuesta

0

Git debe encontrar los nombres de los archivos. Sin embargo, si el archivo ha cambiado un 50% o más líneas en ese archivo, ya no se considerará un cambio de nombre. Puede cambiar esto umbral si lo desea.

Aquí está el comando para hacerlo:

git log -M --diff-filter=R --stat 

Solo le mostrará los cambios de nombre. Si desea cambiar el umbral a otra cosa que no sea el valor por defecto de 50%, se puede simplemente añadir el número a la opción M:

git log -M90 --diff-filter=R --stat 

sólo se tendrá en cuenta un archivo como renombrado si los contenidos han cambiado en no más de un 10%

UPDATE:

Para saltar todos los pasos intermedios, utiliza diff su lugar. Git seguirá los cambios de nombre:

git diff -M --diff-filter=R --name-status ..master | cut -f2- 

cuando se encuentre en la rama de tema.

A continuación, puede canalizar esto para hacer un montón de instrucciones sed para ajustar sus referencias.

+0

su comando es bastante útil, pero todavía tengo que raspar para lograr mi objetivo – helt

+0

¿qué quieres? Puede formatear la salida a su gusto. Debería poder canalizarlo a algunos comandos más si lo necesita. No deberías necesitar recorrer tu historia. –

+0

'git log -M --diff-filter = R --name-status --reverse' proporciona una lista de todos los renombrados en el orden necesario (el más antiguo primero). Pero tengo el viejo nombre SOLAMENTE. El problema no es encontrar el cambio de nombre directo del nombre anterior, sino encontrar todos los sucesivos cambios de nombre posteriormente. Esperemos que sea algo comprensible ahora. – helt

-1

no pude encontrar una respuesta satisfactoria en la web, por lo que he escrito un guión (incómoda) para ir a través de los registros uno por uno (el cambio de nombre por el cambio de nombre)

Usando la secuencia de comandos con el ejemplo anterior proporciona la salida follwing:

$ git history path/to/File.java

final/package/FinalName.java

que añade el guión a mi ~.bashrc y ha añadido una opción de la alias.history=!bash -ic 'git_file_history "[email protected]"' - a mi git config mundial

#! /bin/sh 
### Takes a filename as parameter ($1) 
### Echoes all filenames related to $1 
function git_file_history() { 
     loc_var=$1; 
     old="" 
     while [ "$loc_var" != "$old" ] && [ "$loc_var" != "" ] 
     do 
       old=$loc_var; 
       #echo $loc_var; 
       hashes=$(git log --format="%P %H" -1 --follow -- $loc_var); 
       status=$(git diff --name-status --find-renames $hashes | grep $loc_var); 
       awks=`echo $status | awk '{print $3}'` 
       loc_var=$awks; 
     done 
     echo "$loc_var"; 
} 
Cuestiones relacionadas