在执行git push时警告"diff.renamelimit变量"

sti*_*mth 71 git warnings push

我正在将本地提交推送到远程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.
Run Code Online (Sandbox Code Playgroud)

但实际上我已经将diff.renamelimit设置为0(我认为零意味着无限制,对吧?).

$ git config --list
...
diff.renamelimit=0
Run Code Online (Sandbox Code Playgroud)

那么我该怎么做才能避免这种警告呢?谢谢.

Ser*_*kyy 63

git config merge.renameLimit 999999
Run Code Online (Sandbox Code Playgroud)

merge.renameLimit是什么意思

合并期间执行重命名检测时要考虑的文件数; 如果未指定,则默认为diff.renameLimit的值.

来源:https://git-scm.com/docs/git-merge

  • 为什么这是`merge.renameLimit`而不是`diff.renameLimit`? (26认同)
  • 有人可能_不_想要最大限度地发挥这一点,是否有原因?首先为什么会存在极限?只是为了让你的 CPU 免受疯狂的大型合并的影响? (3认同)
  • git config diff.renameLimit 999999(插入您自己的号码)对我有用。 (2认同)

Von*_*onC 59

文档没有提到0作为特殊值diff.renamelimit.
因此,您应将该限制设置为建议的值.
或者您可以尝试完全停用重命名检测.(git config diff.renames 0)

你会在这篇博客文章" Confluence,git,rename,merge oh my my "中找到类似的例子:

如前所述,git尝试在该事实之后检测文件重命名,例如在使用git log或时git diff/merge.
当试图检测重命名时,git区分精确和不精确的重命名,前者是重命名而不改变文件的内容,后者是重命名,可能包括对文件内容的更改(例如重命名/移动Java类).
这种区别很重要,因为用于检测精确重命名的算法是线性的,并且将始终执行,而不精确重命名检测的算法是二次(O(n^2)),如果更改的文件数超过某个阈值,则git不会尝试执行此操作(1000默认).

由于受最近重组影响的文件数超过此阈值,git只是放弃并将合并解决方案留给开发人员.在我们的例子中,我们可以通过更改阈值来避免手动合并解决方案


注意:Git 2.16(2018年第一季度)将修改该限制:

历史上,用于重命名检测的差异机器具有32k路径的硬编码限制; 这被提升以允许用户通过(可能)更容易阅读的结果进行交易.

Jonathan Tan()的提交8997355(2017年11月29日). 请参阅Elijah Newren()提交9268cf4,提交9f7e4bf,提交d6861d0,提交b520abf(2017年11月13日).(由Junio C Hamano合并- -提交6466854,2017年12月19日)jhowtan
newren
gitster

diff:删除无声钳 renameLimit

提交0024a54(修复重命名检测限制检查; 2007年9月,Git v1.5.3.2)中,renameLimit被限制为32767.
这似乎是在以下计算中简单地避免整数溢出:

num_create * num_src <= rename_limit * rename_limit
Run Code Online (Sandbox Code Playgroud)

虽然它也可以被视为CPU时间量的硬编码限制,但我们愿意让用户告诉git花费在处理重命名上.
上限可能有意义,但不幸的是,这个上限既没有传达给用户,也没有记录在任何地方.

虽然很大的限制可能会使事情变得缓慢,但即使他们必须手动指定一个大的限制并等待十分钟才能检测到重命名,我们的用户会欣喜若狂地获得一个小的五个文件更改.

使用" -l0"继续工作的现有脚本和工具,将0视为一个特殊值,表示重命名限制是一个非常大的数字.


Git 2.17(2018年第二季度)将避免在" git diff"输出行的中间显示警告消息.

提交4e056c9通过(2018年1月16日)阮泰玉维战(pclouds).
(由Junio C gitsterHamano合并- -提交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 +-
Run Code Online (Sandbox Code Playgroud)

如果在已经打印了图形部件的颜色代码之后打印警告,情况会变得更糟.您将收到绿色或红色警告.

首先刷新stdout,所以我们可以得到这样的东西:

 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.
Run Code Online (Sandbox Code Playgroud)


Tim*_*imo 5

如果您不是经常遇到这个问题,而是它只是一次性的事情,那么更改全局配置的默认值可能是一种矫枉过正。我建议您只需使用该-c选项来为这个命令设置一个特殊的配置。就像是:

git -c "diff.renamelimit=19824" push
Run Code Online (Sandbox Code Playgroud)