我正在将本地提交推送到远程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
那么我该怎么做才能避免这种警告?感谢。
答案 0 :(得分:53)
documentation并未提及0作为diff.renamelimit
的特殊值
因此,您应将该限制设置为建议的值
或者您可以尝试完全停用重命名检测。 (git config diff.renames 0
)
您会在此博客文章“Confluence, git, rename, merge oh my...”中找到类似的示例:
正如已经提到的,git尝试在此之后检测文件重命名,例如在使用
git log
或git diff/merge
时。 当试图检测重命名时,git区分精确和不精确的重命名,前者是重命名而不改变文件的内容,后者是重命名,可能包括对文件内容的更改(例如重命名/移动Java类)。
这种区别很重要,因为用于检测精确重命名的算法是线性的,并且将始终执行,而不精确重命名检测的算法是二次的(O(n^2)
),如果更改的文件数超过a,git不会尝试执行此操作某个阈值(默认为1000)。由于最近重组影响的文件数超过此阈值,git只是放弃并将合并解决方案留给开发人员。在我们的例子中,我们可以通过更改阈值来避免手动合并解决方案
注意:Git 2.16(2018年第一季度)将修改该限制:
历史上,用于重命名检测的差异机器有一个 32k路径的硬编码限制;这是为了让用户解除 交易周期(可能)更容易阅读结果。
commit 8997355见Jonathan Tan (jhowtan
)(2017年11月29日)
请commit 9268cf4查看commit 9f7e4bf,commit d6861d0,commit b520abf,Elijah Newren (newren
)(2017年11月13日)。
(Junio C Hamano -- gitster
--合并于commit 6466854,2017年12月19日)
的无声钳位
diff
:移除renameLimit
在commit 0024a54(修复重命名检测限制检查; 2007年9月,Git v1.5.3.2)中,
renameLimit
被限制为32767.
这似乎是在以下计算中简单地避免整数溢出:num_create * num_src <= rename_limit * rename_limit
虽然它也可以被视为CPU数量的硬编码界限 我们愿意让用户告诉git花在处理上的时间 重命名。
上限可能有意义,但不幸的是这个上限 bound既没有传达给用户,也没有记录在任何地方。虽然很大的限制会让事情变得缓慢但我们会有用户 欣喜若狂的小五个文件更改正确樱桃挑选甚至 如果他们必须手动指定一个大的限制并等待十分钟 重命名要被检测。
使用“-l0
”继续工作的现有脚本和工具,将0视为一个特殊值,表示重命名限制是一个非常大的数字。
Git 2.17(2018年第二季度)将避免在“git diff
”输出行的中间显示警告消息。
commit 4e056c9见Nguyễn Thái Ngọc Duy (pclouds
)(2018年1月16日)
(由Junio C Hamano -- gitster
--合并于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.
答案 1 :(得分:52)
git config merge.renameLimit 999999
merge.renameLimit 是什么意思
合并期间执行重命名检测时要考虑的文件数;如果未指定,则默认为 diff.renameLimit 的值。