Advertencia sobre "diff.renamelimit variable" al hacer git push

86

Estoy enviando la confirmación local al servidor git remoto y recibí los siguientes mensajes de advertencia:

remote: warning: only found copies from modified paths due to too many files.
remote: warning: you may want to set your diff.renamelimit variable to at least 19824 and retry the command.

Pero en realidad ya puse el diff.renamelimit en 0 (creo que cero significa ilimitado, ¿verdad?).

$ git config --list
...
diff.renamelimit=0

Entonces, ¿qué debo hacer para evitar esta advertencia? Gracias.

stid.smth
fuente

Respuestas:

67

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 logo 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ó renameLimita 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 diffsalida " ".

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 stdoutantes de imprimir las advertencias de cambio de nombre

La salida de diferencia se almacena en búfer en un FILEobjeto 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.
VonC
fuente
79
git config merge.renameLimit 999999

Lo que hace merge.renameLimit media

El número de archivos a considerar al realizar la detección de cambio de nombre durante una combinación; si no se especifica, toma el valor predeterminado de diff.renameLimit .

fuente: https://git-scm.com/docs/git-merge

Serge Seletskyy
fuente
34
¿Por qué es esto en merge.renameLimitlugar de diff.renameLimit?
pgpb.padilla
@ pgpb.padilla muy similar
Sandra K
4
git config diff.renameLimit 999999 (inserte su propio número) funcionó para mí.
elarcoiris
1
¿Hay alguna razón por la que alguien no quiera maximizar esto? ¿Por qué existe el límite en primer lugar? ¿Solo para salvar su CPU de fusiones increíblemente grandes?
electrovir