2009-06-25 6 views
116

Cuando muevo un archivo en Git usando git-mv el estado muestra que el archivo se ha cambiado el nombre y aunque alterar algunas partes todavía considera a ser casi lo mismo (lo cual es bueno porque me deja seguir la historia de esto).Record operación de copia de archivos con Git

Cuando copio un archivo del archivo original tiene una historia que me gustaría asociar con la nueva copia.

He intentado mover el archivo a continuación, tratando de volver a la caja en la ubicación original - una vez movido git no me deja de partida de los ubicación original.

He intentado hacer una copia del sistema de archivos y luego añadir el archivo - git enumera como un nuevo archivo.

¿Hay alguna manera de hacer registro git una operación de copia de archivos de una manera similar a cómo se graba un archivo de cambio de nombre/mover donde la historia se remonta al archivo original?

Respuesta

99

Git no renombra el seguimiento ni copia el seguimiento, lo que significa que no registro renombra o copia. Lo que hace es cambiar el nombre y copiar detección. Puede solicitar la detección de cambio de nombre en git diff (y git show) mediante la opción -M, puede solicitar la detección copia adicional en los archivos modificados mediante la opción -C (-C implica -M), y se puede pedir más caro de detección de copia entre todos los archivos con --find-copies-harder o -C -C (que implica -C, lo que implica -M). Consulte la página de manual git-diff.

También puede configurar git hacer siempre cambiar el nombre de la detección mediante el establecimiento de diff.renames a un valor booleano verdadero (por ejemplo true o 1), y se puede solicitar git hacer copia de detección demasiado estableciéndolo en copy o copies. Consulte la página de manual git-config.

Compruebe también la opción -l en git diff y la variable de configuración relacionada diff.renameLimit.


Tenga en cuenta que git log <pathspec> funciona de forma diferente en Git: aquí <pathspec> es un conjunto de delimitadores de ruta, donde ruta de acceso puede ser un (sub) nombre del directorio. Filtra y simplifica el historial antes de renombrar y copiar la detección entra en juego. Si desea seguir el cambio de nombre y las copias, use git log --follow <filename> (que actualmente es un poco limitado, y funciona solo para un solo archivo).

+0

@allyourcode: Lo que usted está confundido acerca de? Para activar la detección de copia de forma predeterminada, establece 'diff.renames' en' copies' (por ejemplo, '' git config diff.renames copies' '). Estoy de acuerdo en que es un poco contrario a la intuición. –

+0

Una sección que parece que no puedo analizar es "y puede solicitar que se haga de forma predeterminada también cambiar el nombre de detección". ¿Estás diciendo que hay cuatro valores que pueden usar los nombres diferentes (verdadero, 1, copia, copias) y que todos hacen lo mismo? – allyourcode

+1

@allyourcode: Lo siento, no me he dado cuenta de esto. Corregido ahora, gracias. –

5

Puede forzar Git para detectar la historia del archivo copiado:

  • En lugar de copiar, cambiar a una nueva rama y movimiento el archivo a su nueva ubicación allí.
  • Cambie a la rama original y cambie el nombre del archivo.
  • Fusiona la nueva rama en la rama original, resolviendo el conflicto trivial manteniendo ambos archivos.
  • Restaure el nombre de archivo original en una confirmación separada.

(solución tomada https://stackoverflow.com/a/44036771/1389680.)

+0

Simplicidad, brevedad, 100% ... Esta respuesta es servicio público ... votando todo a la vista – ptim

Cuestiones relacionadas