来自 资讯 2022-06-09 12:00 的文章

云盾_高防cdn怎么搭建_3天试用

云盾_高防cdn怎么搭建_3天试用

在GITPalAutoReXSerp 16, 2019·10分钟内重命名和深层目录层次结构在PalANTR中读取,我们的一个库中有大量文件(与Linux内核相当),并且由于主要包含java代码而损坏了深层目录层次结构。在如此大的存储库中重构工作流程,包括重命名顶级目录,可以作为Git动态重命名处理的一个有用的压力测试案例……显示了它的多个不足之处。

这篇博客文章解释了什么,为什么,在过去两年中,我们为Git在这一领域做出了许多改进。最重要的贡献是目录重命名检测,即实施了一种误导性的简单想法,即当历史的另一端重命名该目录时,历史的另一端添加的新文件应与同一目录中的其他文件一起移动。

数字上的弱点

在一种特殊情况下,试图选择一个更改了少数文件的单一提交会带来几个问题。设置大致如下:

基本版本:大量文件和目录,但值得注意的是,有一个名为olddir/的目录,其中包含多个Java文件我们的提交:添加一个新文件olddir/FileH.Java,并修改olddir/Upstream中的其他几个文件:重命名olddir/->newdir/并修改该目录中的一些文件,加上对许多其他文件的编辑,产生了巨大的总体差异。

当我们选择此项时,我们看到以下内容:

$git cherry pick$COMMITerror:无法应用$COMMIT。。。提交摘要提示:解决冲突后,用"git add"或"git rm"标记更正后的路径提示:并用"git commit"$git status提交结果…要提交的更改:新文件:olddir/FileH.javaUnmerged path:deleted by us:olddir/FileA.java deleted by us:olddir/FileB.java deleted by us:olddir/FileC.java deleted by us:olddir/field.java被我们删除:olddir/FileE.java被我们删除:olddir/FileF.java被我们删除:olddir/FileG.java

这里有多个问题。上述输出中最常见的可能是令人困惑的"被我们删除"行。为了理解这些,请注意,如果我们没有检测到重命名,例如olddir/FileA.java->newdir/FileA.java,那么它看起来像是删除了olddir/FileA.java,并添加了一些不相关的newdir/FileA.java(即使新文件恰好有非常相似的内容)。如果一方删除一个文件,而另一方修改了它,那么您将得到一个修改/删除冲突,并产生如上所述的输出。这迫使用户手动合并olddir/FileA.java和newdir/FileA.java,用户通常不知道如何访问"基本"版本;对于用户来说,这往往是一个容易出错的过程,很容易导致意外遗漏任何一方的一些代码更改。

从上面的输出来看,下一组问题不一定很明显,但对于希望了解Git正在做什么并让它检测重命名的用户来说,这一过程变得很明显:

尽管需要很长时间,联盟集群ddos防御系统,未提供有关樱桃拾取进度的更新。未提供由于merge.renameLimit过低而中止重命名检测的通知。即使用户猜测要增加merge.renameLimit,如果此配置高于任意值,则将忽略此配置,硬编码32767阈值。

在我们解决了这些问题后(包括在提交消息中使用短语"对任何人来说都应该足够"有点乐趣),输出要好得多:

$git-c merge.renameLimit=50000 cherry pick$COMMITPerforming unexecute rename detection:100%(28367183/28367183),已完成。错误:无法应用$COMMIT。。。提交摘要提示:解决冲突后,ddos攻击直播平台怎么防御,用"git add"或"git rm"标记更正的路径提示:并用"git commit"$git status提交结果…要提交的更改:新文件:olddir/FileH.java修改:newdir/FileA.java修改:newdir/FileC.java修改:newdir/field.java修改:newdir/FileE.java修改:newdir/FileF.java未合并路径:均已修改:newdir/FileB.java均已修改:newdir/FileG.java

在这种情况下,我们有几个改进:

如果用户取消了merge.renameLimit设置,他们会收到一条消息说,防范,由于重命名太多,重命名检测被跳过,并建议设置merge.renameLimit。当设置大于32767时,不会忽略该设置。当重命名检测运行时,会提供进度输出。大多数文件已干净地合并了历史两侧的更改,用户可以查看newdir/FileB.java和newdir/FileG.java以查看哪里存在冲突并解决它们,同时这些文件中干净合并的所有更改都已为用户处理。

真正的关键:目录重命名检测

在上述示例中,FileH.java仍然是一个问题;它在错误的目录中。历史的上游没有将olddir/FileH.java重命名为newdir/FileH.java,因为olddir/FileH.java不存在。因此,如果只单独查看文件,安徽抗ddos天网防御,那么将FileH.java保留在olddir/中是合理的。但是,如果您的构建系统只在某些目录中构建源代码,或者如果FileH.java打算与它添加到的目录中的其他文件一起使用,那么问题就在恼人和bug之间。我们更希望Git检测到目录重命名,并将FileH.java移动到newdir/下,同时将文件放在旁边。