Warnung zu "diff.renamelimit variable" beim git push

86

Ich schiebe das lokale Commit auf den Remote-Git-Server und erhalte die folgenden Warnmeldungen:

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.

Aber eigentlich habe ich das diff.renamelimit bereits auf 0 gesetzt (ich denke Null bedeutet unbegrenzt, oder?).

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

Was soll ich also tun, um diese Warnung zu vermeiden? Vielen Dank.

stid.smth
quelle

Antworten:

67

In der Dokumentation wird 0 nicht als Sonderwert für erwähnt diff.renamelimit.
Daher sollten Sie diese Grenze auf den empfohlenen Wert setzen.
Oder Sie können versuchen, die Umbenennungserkennung vollständig zu deaktivieren. ( git config diff.renames 0)

Ein ähnliches Beispiel finden Sie in diesem Blog-Beitrag " Confluence, git, rename, merge oh my ... ":

Wie bereits erwähnt, versucht git, nach dieser Tatsache das Umbenennen von Dateien zu erkennen, beispielsweise bei Verwendung von git logoder git diff/merge.
Beim Versuch, Umbenennungen zu erkennen, unterscheidet git zwischen exakten und ungenauen Umbenennungen, wobei die erstere eine Umbenennung ist, ohne den Inhalt der Datei zu ändern, und die letztere eine Umbenennung, die möglicherweise Änderungen am Inhalt der Datei enthält (z. B. Umbenennen / Verschieben einer Java-Klasse).
Diese Unterscheidung ist wichtig, da der Algorithmus zum Erkennen exakter Umbenennungen linear ist und immer ausgeführt wird, während der Algorithmus zum Erkennen ungenauer Umbenennungen quadratisch ist ( O(n^2)) und git dies nicht versucht, wenn die Anzahl der geänderten Dateien einen bestimmten Schwellenwert überschreitet (1000 mal) Standard).

Da die Anzahl der von der letzten Reorganisation betroffenen Dateien diesen Schwellenwert überschreitet, gibt git einfach auf und überlässt die Zusammenführungsauflösung dem Entwickler. In unserem Fall können wir eine manuelle Zusammenführungsauflösung vermeiden, indem wir den Schwellenwert ändern


Hinweis: Git 2.16 (Q1 2018) wird diese Grenze ändern:

In der Vergangenheit hatte die Diff-Maschinerie zur Erkennung von Umbenennungen eine fest codierte Grenze von 32.000 Pfaden. Dies wird aufgehoben, um Benutzern Handelszyklen mit einem (möglicherweise) besser lesbaren Ergebnis zu ermöglichen.

Siehe Commit 8997355 (29. November 2017) von Jonathan Tan ( jhowtan) .
Siehe Commit 9268cf4 , Commit 9f7e4bf , Commit d6861d0 , Commit b520abf (13. November 2017) von Elijah Newren ( newren) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 6466854 , 19. Dezember 2017)

diff: Entfernen Sie die leise Klemme von renameLimit

In Commit 0024a54 (Fix the Rename Detection Limit Checking; Sept. 2007, Git v1.5.3.2) wurde das renameLimitauf 32767 geklemmt.
Dies scheint darin bestanden zu haben, einen ganzzahligen Überlauf bei der folgenden Berechnung einfach zu vermeiden:

num_create * num_src <= rename_limit * rename_limit

Obwohl es auch als fest codierte Grenze für die CPU-Zeit angesehen werden kann, sind wir bereit, Benutzern zu erlauben, git anzuweisen, für die Bearbeitung von Umbenennungen aufzuwenden.
Eine Obergrenze mag sinnvoll sein, aber leider wurde diese Obergrenze weder den Benutzern mitgeteilt noch irgendwo dokumentiert.

Obwohl große Limits die Dinge verlangsamen können, haben wir Benutzer, die begeistert wären, wenn eine kleine Änderung von fünf Dateien korrekt ausgewählt würde, selbst wenn sie manuell ein großes Limit angeben und zehn Minuten warten müssen, bis die Umbenennungen erkannt werden.

Bestehende Skripte und Tools, die " -l0" verwenden, um weiterzuarbeiten, wobei 0 als spezieller Wert behandelt wird, der angibt, dass das Umbenennungslimit eine sehr große Zahl sein soll.


Git 2.17 (Q2 2018) verhindert, dass eine Warnmeldung in der Mitte einer Zeile " git diff" angezeigt wird.

Siehe Commit 4e056c9 (16. Januar 2018) von Nguyễn Thái Ngọc Duy ( pclouds) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 17c8e0b , 13. Februar 2018)

diff.c: stdoutVor dem Drucken spülen. Warnungen umbenennen

Die Diff-Ausgabe wird in einem FILEObjekt gepuffert und kann beim Drucken dieser Warnungen (direkt an fd 2) noch teilweise gepuffert werden .
Die Ausgabe ist so durcheinander

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

Es wird schlimmer, wenn die Warnung gedruckt wird, nachdem die Farbcodes für das Diagrammteil bereits gedruckt wurden. Sie erhalten eine Warnung in grün oder rot.

Spülen Sie zuerst stdout, damit wir stattdessen so etwas bekommen können:

 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
quelle
75
git config merge.renameLimit 999999

Was bedeutet merge.renameLimit Mittelwert

Die Anzahl der Dateien, die bei der Erkennung des Umbenennens während einer Zusammenführung berücksichtigt werden müssen. Wenn nicht angegeben, wird standardmäßig der Wert diff.renameLimit verwendet .

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

Serge Seletskyy
quelle
32
warum ist das merge.renameLimitstatt diff.renameLimit?
pgpb.padilla
@ pgpb.padilla sehr ähnlich
Sandra K
4
git config diff.renameLimit 999999 (geben Sie Ihre eigene Nummer ein) hat bei mir funktioniert.
Elarcoiris
Gibt es einen Grund, warum jemand dies nicht maximal nutzen möchte? Warum gibt es das Limit überhaupt? Nur um Ihre CPU vor wahnsinnig großen Zusammenführungen zu schützen?
Electrovir