web-dev-qa-db-ja.com

git pushを行う際の「diff.renamelimit変数」に関する警告

ローカルコミットをリモートgitサーバーにプッシュすると、次の警告メッセージが表示されます。

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.

しかし実際には、diff.renamelimitをすでに0に設定しています(ゼロは無制限を意味すると思いますか?)。

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

この警告を回避するにはどうすればよいですか?ありがとう。

68
stid.smth

documentation は、diff.renamelimitの特別な値として0について言及していません。
したがって、その制限を推奨値に設定する必要があります。
または、名前変更検出を完全に無効にすることもできます。 (git config diff.renames 0

このブログ記事「 Confluence、git、rename、merge oh my ... 」にも同様の例があります。

既に述べたように、gitはgit logまたはgit diff/mergeを使用する場合など、その事実の後にファイル名の変更を検出しようとします。
名前の変更を検出しようとすると、gitは正確な名前と不正確な名前を区別します。前者はファイルの内容を変更せずに名前を変更し、後者はファイルの内容への変更を含む名前の変更(名前の変更/移動など) Java Class)。
正確な名前の変更を検出するアルゴリズムは線形であり、不正確な名前の変更を検出するアルゴリズムは2次(O(n^2))でありながらgitは常に実行されるため、この区別は重要です。変更されたファイルの数が特定のしきい値(デフォルトでは1000)を超えています。

最近の再編成の影響を受けるファイルの数がこのしきい値を超えると、gitは単にあきらめ、マージの解決を開発者に任せます。この場合、しきい値を変更することで、手動でのマージ解決を回避できます


注:Git 2.16(2018年第1四半期)はその制限を修正します:

歴史的に、名前変更検出のdiff機構には、32kパスのハードコードされた制限がありました。これは、ユーザーが(おそらく)読みやすい結果でサイクルを交換できるようにするために解除されています。

commit 8997355 (2017年11月29日)by Jonathan Tan(jhowtan を参照してください。
commit 9268cf4commit 9f7e4bfcommit d6861d0 を参照、 commit b520abf (2017年11月13日)by Elijah Newren(newren
Junio C Hamano-gitster- in commit 6466854 、2017年12月19日)

diffrenameLimitのサイレントクランプを削除

commit 0024a54 (名前変更検出制限のチェックを修正、2007年9月、Git v1.5.3.2)で、renameLimitは32767に固定されました。
これは、次の計算で整数オーバーフローを単純に回避するために行われたようです。

num_create * num_src <= rename_limit * rename_limit

CPU時間のハードコーディングされた境界として見ることもできますが、ユーザーがgitに名前の変更の処理に費やすように指示できるようにしたいと考えています。
上限は理にかなっているかもしれませんが、残念ながらこの上限はユーザーに伝えられず、どこにも文書化されていません。

大きな制限により処理が遅くなる可能性がありますが、手動で大きな制限を指定し、名前の変更が検出されるまで10分間待機する必要がある場合でも、小さな5つのファイルの変更を適切に選択することに夢中になるユーザーがいます。

-l0」を使用して作業を続行する既存のスクリプトとツールは、0を特別な値として扱い、名前変更の制限が非常に大きいことを示します。


Git 2.17(2018年第2四半期)では、「git diff」出力の行の途中に警告メッセージが表示されなくなります。

commit 4e056c9 (2018年1月16日)by NguyễnTháiNgọcDuy(pclouds を参照してください。
Junio C Hamano-gitster- in commit 17c8e0b 、2018年2月13日)

diff.c:名前変更の警告を出力する前にstdoutをフラッシュします

Diff出力はFILEオブジェクトにバッファリングされますが、これらの警告を(fd 2に直接)出力すると、部分的にバッファリングされる可能性があります。
出力はこのように台無しになります

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

グラフパーツのカラーコードが既に印刷された後に警告が印刷されると、さらに悪化します。緑または赤の警告が表示されます。

最初に標準出力をフラッシュするので、代わりに次のようなものを取得できます。

 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.
58
VonC
git config merge.renameLimit 999999

merge.renameLimitの意味

マージ中に名前変更の検出を実行するときに考慮するファイルの数。指定しない場合、デフォルトはdiff.renameLimitの値になります。

ソース: https://git-scm.com/docs/git-merge

59
Serge Seletskyy