La documentación no menciona 0 como un valor especial para diff.renamelimit
.
Por lo tanto, debe establecer ese límite en el valor recomendado.
O puede intentar desactivar la detección de cambio de nombre por completo. ( git config diff.renames 0
)
Encontrará un ejemplo similar en esta publicación de blog " Confluencia, git, renombrar, fusionar oh mi ... ":
Como ya se mencionó, git intenta detectar cambios de nombre de archivos después de ese hecho, por ejemplo, al usar git log
o git diff/merge
.
Cuando intenta detectar cambios de nombre, git distingue entre cambios de nombre exactos e inexactos, siendo el primero un cambio de nombre sin cambiar el contenido del archivo y el segundo un cambio de nombre que puede incluir cambios en el contenido del archivo (por ejemplo, cambiar el nombre / mover una clase Java).
Esta distinción es importante porque el algoritmo para detectar cambios de nombre exactos es lineal y siempre se ejecutará mientras que el algoritmo para la detección de cambios de nombre inexactos es cuadrático ( O(n^2)
) y git no intenta hacer esto si el número de archivos cambiados excede un cierto umbral (1000 por defecto).
Como el número de archivos afectados por la reorganización reciente supera este umbral, git simplemente se da por vencido y deja la resolución de la fusión al desarrollador. En nuestro caso, podemos evitar hacer una resolución de fusión manual cambiando el umbral
Nota: Git 2.16 (Q1 2018) modificará ese límite:
Históricamente, la maquinaria de diferencias para la detección de cambio de nombre tenía un límite codificado de 32k rutas; esto se está eliminando para permitir a los usuarios intercambiar ciclos con un resultado (posiblemente) más fácil de leer.
Consulte el compromiso 8997355 (29 de noviembre de 2017) de Jonathan Tan ( jhowtan
) .
Consulte la confirmación 9268cf4 , la confirmación 9f7e4bf , la confirmación d6861d0 , la confirmación b520abf (13 de noviembre de 2017) por Elijah Newren ( newren
) .
(Combinado por Junio C Hamano - gitster
- en el compromiso 6466854 , 19 de diciembre de 2017)
diff
: retire la abrazadera silenciosa de renameLimit
En la confirmación 0024a54 (Corregir la comprobación del límite de detección de cambio de nombre; septiembre de 2007, Git v1.5.3.2), se fijó renameLimit
a 32767.
Esto parece haber sido simplemente para evitar el desbordamiento de enteros en el siguiente cálculo:
num_create * num_src <= rename_limit * rename_limit
Aunque también podría verse como un límite codificado en la cantidad de tiempo de CPU que estamos dispuestos a permitir que los usuarios le digan a git que dedique a manejar los cambios de nombre.
Un límite superior puede tener sentido, pero desafortunadamente este límite superior no se comunicó a los usuarios ni se documentó en ninguna parte.
Aunque los límites grandes pueden ralentizar las cosas, tenemos usuarios que estarían encantados de que se seleccionara correctamente un pequeño cambio de cinco archivos, incluso si tienen que especificar manualmente un límite grande y esperar diez minutos para que se detecten los cambios de nombre.
Scripts y herramientas existentes que utilizan " -l0
" para seguir trabajando, tratando 0 como un valor especial que indica que el límite de cambio de nombre debe ser un número muy grande.
Git 2.17 (Q2 2018) evitará mostrar un mensaje de advertencia en medio de una línea de git diff
salida " ".
Consulte la confirmación 4e056c9 (16 de enero de 2018) de Nguyễn Thái Ngọc Duy ( pclouds
) .
(Combinado por Junio C Hamano - gitster
- en el compromiso 17c8e0b , 13 de febrero de 2018)
diff.c
: enjuague stdout
antes de imprimir las advertencias de cambio de nombre
La salida de diferencia se almacena en búfer en un FILE
objeto y aún podría estar parcialmente en búfer cuando imprimimos estas advertencias (directamente en fd 2
).
La salida está desordenada así
worktree.c | 138 +-
worktree.h warning: inexact rename detection was skipped due to too many files.
| 12 +-
wrapper.c | 83 +-
Es peor si la advertencia se imprime después de que los códigos de color para la parte del gráfico ya estén impresos. Recibirá una advertencia en verde o rojo.
Primero elimine stdout, para que podamos obtener algo como esto en su lugar:
xdiff/xutils.c | 42 +-
xdiff/xutils.h | 4 +-
1033 files changed, 150824 insertions(+), 69395 deletions(-)
warning: inexact rename detection was skipped due to too many files.
merge.renameLimit
lugar dediff.renameLimit
?