100 votes

Avertissement sur la variable "diff.renamelimit" lors d'un git push

Je pousse le commit local vers le serveur git distant et j'obtiens les messages d'avertissement suivants :

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.

Mais en fait, j'ai déjà fixé la diff.renamelimit à 0 (je pense que zéro signifie illimité, non ?).

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

Que dois-je donc faire pour éviter cet avertissement ? Merci.

100voto

Serge Seletskyy Points 1859
git config merge.renameLimit 999999

Qu'est-ce que limite de renommage de la fusion moyenne

Le nombre de fichiers à prendre en compte lors de la détection des renommages pendant une fusion ; s'il n'est pas spécifié, la valeur par défaut est de diff.renameLimit .

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

38 votes

Pourquoi est-ce que merge.renameLimit au lieu de diff.renameLimit ?

0 votes

@pgpb.padilla très similaire

8 votes

Git config diff.renameLimit 999999 (insérez votre propre nombre) a fonctionné pour moi.

74voto

VonC Points 414372

El documentation ne mentionne pas 0 comme valeur spéciale pour les diff.renamelimit .
Vous devez donc fixer cette limite à la valeur recommandée.
Ou vous pouvez essayer de désactiver complètement la détection des renommages. ( git config diff.renames 0 )

Vous trouverez un exemple similaire dans ce billet de blog " Confluence, git, renommer, fusionner oh my... " :

Comme déjà mentionné, git essaie de détecter les renommages de fichiers après coup, par exemple en utilisant git log o git diff/merge .
Lorsqu'il tente de détecter les renommages, git fait la distinction entre les renommages exacts et inexacts, le premier étant un renommage sans modification du contenu du fichier et le second un renommage qui peut inclure des modifications du contenu du fichier (par exemple, renommer/déplacer une classe Java).
Cette distinction est importante car l'algorithme de détection des renommages exacts est linéaire et sera toujours exécuté alors que l'algorithme de détection des renommages inexacts est quadratique ( O(n^2) ) et git ne tente pas de le faire si le nombre de fichiers modifiés dépasse un certain seuil (1000 par défaut).

Comme le nombre de fichiers affectés par la récente réorganisation dépasse ce seuil, git abandonne simplement et laisse la résolution de la fusion au développeur. Dans notre cas, nous pouvons éviter la résolution manuelle des fusions en modifiant le seuil.


Remarque : Git 2.16 (Q1 2018) modifiera cette limite :

Historiquement, la machinerie diff pour la détection des renommages avait une limite codée en dur de 32k chemins ; cette limite est levée pour permettre aux utilisateurs utilisateurs d'échanger des cycles avec un résultat (éventuellement) plus facile à lire.

Voir commettre 8997355 (29 nov. 2017) par Jonathan Tan ( jhowtan ) .
Voir commettre 9268cf4 , commettre 9f7e4bf , commettre d6861d0 , commettre b520abf (13 nov. 2017) par Elijah Newren ( newren ) .
(fusionné par Junio C Hamano -- gitster -- sur commettre 6466854 , 19 décembre 2017)

diff : retirer la pince silencieuse de renameLimit

En commettre 0024a54 (Correction de la vérification de la limite de détection des renommages ; Sept. 2007, Git v1.5.3.2), la renameLimit a été fixé à 32767.
Il semble que ce soit simplement pour éviter un dépassement d'entier dans le calcul suivant :

num_create * num_src <= rename_limit * rename_limit

Bien que cela puisse également être considéré comme une limite codée en dur sur la quantité de CPU que nous sommes prêts à permettre aux utilisateurs de dire à git de dépenser pour gérer les renommages. renommages.
Une limite supérieure peut avoir du sens, mais malheureusement, cette limite supérieure n'a pas de sens. n'a pas été communiquée aux utilisateurs, ni documentée nulle part.

Bien que de grandes limites puissent rendre les choses lentes, nous avons des utilisateurs qui seraient qui seraient ravis qu'un petit changement de cinq fichiers soit correctement sélectionné, même s'ils doivent spécifier manuellement une limite élevée et attendre dix minutes pour que les renommages soient détectés.

Les scripts et outils existants qui utilisent " -l0 "pour continuer à travailler, en traitant 0 comme une valeur spéciale indiquant que la limite de renommage doit être un très grand nombre.


Git 2.17 (Q2 2018) évitera d'afficher un message d'avertissement au milieu d'une ligne de " git diff " sortie.

Voir commettre 4e056c9 (16 janvier 2018) par Nguyen Thái Ngoc Duy ( pclouds ) .
(fusionné par Junio C Hamano -- gitster -- sur commettre 17c8e0b , 13 février 2018)

diff.c : chasse d'eau stdout avant d'imprimer les avertissements de renommage

La sortie diff est mise en mémoire tampon dans un FILE et pourrait encore être partiellement mis en mémoire tampon lorsque nous imprimons ces avertissements (directement à fd 2 ).
La sortie est brouillée comme ceci

worktree.c                                   |   138 +-
worktree.h        warning: inexact rename detection was skipped due to too many files.
                                             |    12 +-
wrapper.c                                    |    83 +-

La situation s'aggrave si l'avertissement est imprimé alors que les codes de couleur de la partie graphique sont déjà imprimés. Vous obtiendrez alors un avertissement en vert ou en rouge.

Videz d'abord le stdout, afin d'obtenir quelque chose comme ceci à la place :

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.

Avec Git 2.33 (Q3 2021), la documentation sur " git diff -l<n> " ( homme ) y diff.renameLimit ont été mises à jour, et les valeurs par défaut de ces limites ont été augmentées.

Voir commettre 94b82d5 , commit 9dd29db , commettre 6623a52 , commettre 05d2c61 (15 juillet 2021) par Elijah Newren ( newren ) .
(fusionné par Junio C Hamano -- gitster -- sur commettre 268055b , 28 juillet 2021)

diffcore-rename : traiter un rename_limit de 0 comme illimité

Signé par : Elijah Newren

En commettre 8997355 (" diffcore-rename : make diff-tree -l0 mean -l", 2017-11-29, Git v2.16.0-rc0 -- fusionner répertorié dans lot n° 10 ), -l0 s'est vu attribuer une valeur magique spéciale "grande", mais qui n'était pas assez grande pour certaines utilisations (comme on peut le voir dans l'exemple ci-dessous). commettre 9f7e4bf (" diff : retirer la pince silencieuse de renameLimit ", 2017-11-13, Git v2.16.0-rc0 -- fusionner répertorié dans lot n° 10 ).
Faites en sorte que 0 (ou une valeur négative) soit traité comme illimité à la place et mettez à jour la documentation pour le mentionner.

diff-options inclut désormais dans son page de manuel :

Notez qu'une valeur de 0 est traitée comme illimitée.

1voto

Timo Lehto Points 1603

Si vous n'êtes pas constamment confronté à ce problème, mais qu'il s'agit plutôt d'une situation ponctuelle, modifier la configuration globale à partir de sa valeur par défaut peut s'avérer excessif. Je vous suggère d'utiliser simplement la fonction -c pour définir une configuration spéciale juste pour cette commande. Quelque chose comme :

git -c "diff.renamelimit=19824" push

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X