【问题标题】:git merge with renamed filesgit合并重命名文件
【发布时间】:2011-02-11 16:58:57
【问题描述】:

我有一个大型网站,我正在迁移到一个新框架并在添加 git 的过程中。当前站点没有任何版本控制。

我首先将站点复制到一个新的 git 存储库中。我创建了一个新分支并进行了所有需要的更改,以使其与新框架一起工作。其中一个步骤是更改所有页面的文件扩展名。

现在,在我处理新站点的过程中,已对旧站点上的文件进行了更改。所以我切换到 master 并复制了所有这些更改。

问题是当我将分支与新框架合并回 master 时,master 分支上更改的每个文件都存在冲突。

我不会担心它,但有几百个文件有变化。我试过git rebasegit rebase --merge 没有运气。

如何在不处理每个文件的情况下合并这两个分支?

【问题讨论】:

  • 什么样的冲突?您能否提供来自 Git 的有关单个文件冲突的示例消息?
  • CONFLICT (delete/modify): pages/aboutus/pages/employment.php 在转换中删除并在 HEAD 中修改。 pages/aboutus/pages/employment.php 的版本 HEAD 留在树中。该文件未被删除,而是重命名为 index.html。
  • 奇怪的是 git 没有将其检测为重命名,即 CONFLICT(rename/modify),或者只是 CONFLICT(contents)...
  • 文件的内容应该与目录的内容(文件名)无关。这只是 git 仍然失败的众多方式之一。
  • 另见stackoverflow.com/a/35672618/6309git merge --no-renames 与 git 2.8,2016 年 3 月)

标签: git


【解决方案1】:

从 git 1.7.4 开始,您可以将合并的重命名阈值指定为 git merge -X rename-threshold=25 以控制 25% 的相似度已经足以考虑两个文件重命名候选。这取决于具体情况以及-X ignore-space-change 可能会使重命名检测更加可靠。

但是,我希望获得更直接的控制权,并在最近几天编写了一个相关脚本。也许它有帮助 - 让我知道。

https://gist.github.com/894374

【讨论】:

  • 您的脚本看起来很有用,但有关如何使用它的教程会很有帮助。
  • 好吧,我不会称它为教程,但我敢肯定,你看到评论标题中的评论了吗?有什么特别的问题吗?
  • 是的,我不清楚标题中的 :1 和 :3 是什么。我假设“A/a”和“B/b”是 // 但这不是 100% 清楚的。标题中的明确用例会有所帮助。
  • 引用git help revisions:“冒号,可选地后跟阶段号(0到3)和冒号,后跟路径(例如:0:README);这命名了一个blob对象在给定路径的索引中。缺少阶段编号(以及它后面的冒号,例如:README)命名阶段 0 条目。在合并期间,阶段 1 是共同祖先,阶段 2 是目标分支的版本(通常是当前分支),第 3 阶段是正在合并的分支的版本。”我会看看我是否可以提炼出一个简单的示例工作流程。但是,这些往往出现在复杂的合并中......
  • 谢谢,帮了大忙。由于可以在不真正了解阶段编号的情况下使用 git,因此我认为在您的脚本中提供指向该信息的链接会很方便。
【解决方案2】:

由于重命名检测,应该可以自动工作。下面是示例会话:

$ git init test
Initialized empty Git repository in /tmp/jnareb/test/.git/
$ cp ~/git/README .    # example file, large enough so that rename detection works
$ git add .
$ git commit -m 'Initial commit'
[master (root-commit) b638320] Initial commit
 1 files changed, 54 insertions(+), 0 deletions(-)
 create mode 100644 README
$ git checkout -b new-feature        
Switched to a new branch 'new-feature'
$ git mv README README.txt
$ git commit -m 'Renamed README to README.txt'
[new-feature ce7b731] Renamed README to README.txt
 1 files changed, 0 insertions(+), 0 deletions(-)
 rename README => README.txt (100%)
$ git checkout master
Switched to branch 'master'
$ sed -e 's/UNIX/Unix/g' <README >README+ && mv -f README+ README
$ git commit -a -m 'README changed'
[master 57b1114] README changed
 1 files changed, 1 insertions(+), 1 deletions(-)
$ git merge new-feature 
Merge made by recursive.
 README => README.txt |    0
 1 files changed, 0 insertions(+), 0 deletions(-)
 rename README => README.txt (100%)

如果您在 'new-feature' 分支上执行“git merge master”而不是像上面那样在“master”上执行“git merge new-feature”,您会得到:

$ git merge master
Merge made by recursive.
 README.txt |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

你能说说你在做什么不同吗?

注意普通的“git rebase”(和“git pull --rebase”)不接受重命名:你需要运行“git rebase -m”或交互式rebase。

【讨论】:

  • 我玩过“git rebase -m”并且遇到了同样的问题。这看起来就像我使用的相同过程。每次我执行 git merge new-feature 时,都会说原始文件已被删除。
  • 再次查看您的代码有一个不同之处。您使用了 git mv,而我的脚本只是重命名了它没有调用 git mv 的文件。回顾提交,尽管它显示文件被重命名并没有被删除并重新添加。也许 git mv 所做的不仅仅是自动文件移动检测。
  • 通过“mv oldname newname”或通过某些脚本重命名文件后,您需要执行“git add newname”,并使用“git rm --cached oldname”或使用“git commit - a" 拿起重命名的删除部分。 “git mv oldname newname” 会为您执行此操作,但 Git 的重命名检测独立于您的重命名方式。
  • 我也没有得到-m 标志来锻炼。但后来我仔细检查并注意到正常的git merge 也不起作用。 (在我的情况下,可能是因为我在同一个提交中重写+重命名了同一个文件)。
【解决方案3】:

我想出了一个解决办法。由于文件的重命名是由脚本完成的,因此我能够复制新的 .php 文件并在合并之前重新运行脚本。由于文件具有相同的名称,因此合并工作没有冲突。

这是整个过程的步骤。

  1. 创建 git repo git init
  2. 复制现有文件
  3. 提交
  4. 运行脚本重命名文件
  5. 提交
  6. 创建一个分支但不检查它
  7. 随时修复提交更改
  8. 检查您在第 6 步中创建的分支
  9. 复制新版本的文件
  10. 运行脚本重命名文件(这应该替换第一次运行的文件)
  11. 提交
  12. 结帐大师
  13. 将分支合并到master中

这是可行的,因为 git 对具有新名称的文件进行了更改。

【讨论】:

    【解决方案4】:

    在重命名检测失败的情况下,我发现在合并解析期间我可以执行以下操作:

    给定:

    fileA: A modified file that was moved to the new place but is currently in the old place.
    destB: The location where fileB was moved to. This could include a new filename.
    

    运行这些命令:

    git add fileA
    git mv fileA destB
    

    这就是我所要做的。然后我提交了,rebase 继续。

    【讨论】:

    • git add 应该做什么?你的意思是git add fileA
    • 嘿@JBCP:我尝试了你的建议。我正处于冲突合并解决方案的中间,我尝试了git add fileA,然后当我尝试git move fileA destB 时,它告诉我:fatal: destination exists。哦!我刚刚意识到你正处于一个变基的中间,而不是一个git merge。也许这就是问题所在。
    • 会员我强行搬家了?抱歉我不记得了
    【解决方案5】:

    添加到@Tilman 的答案,最近的 git 重命名选项是 -X find-renames=&lt;n&gt;

    【讨论】:

      【解决方案6】:

      十多年后,使用 Git 2.31(2021 年第一季度),新的合并策略应该会有所帮助:ORT(“Ostensibly Recursive's Twin”)。

      在重命名检测上包含了大量的性能优化工作,超越了简单的rename-threshold

      参见commit f78cf97commit 07c9a7fcommit bd24aa2commit da09f65commit a35df33commit f384525commit 829514c(2021 年 2 月 14 日)和commit f15eb7c(2021 年 2 月 3 日)@9876 .
      (由 Junio C Hamano -- gitster -- 合并于 commit 12bd175,2021 年 3 月 1 日)

      例如:

      diffcore-rename:计算源和目标候选者的基本名称

      签字人:Elijah Newren

      我们希望在剩余的源文件和目标文件中使用唯一的基本名称来帮助通知重命名检测,以便可以首先检查更有可能的配对。
      (如果在剩余的已删除和添加的文件中没有其他“foo.txt”文件,src/moduleA/foo.txtsource/module/A/foo.txt 可能相关。)

      添加一个尚未使用的新函数,该函数创建 rename_srcrename_dst, 中的唯一基本名称的映射,以及 rename_src/rename_dst 中显示这些基本名称的索引。

      非唯一的基本名称仍会显示在地图中,但索引无效 (-1)。

      这个函数的灵感来自于在现实世界的存储库中,文件经常在不改变名称的情况下跨目录移动。

      以下是一些示例存储库及其历史重命名(截至 2020 年初)保留基本名称的百分比:

      • Linux:76%
      • GCC:64%
      • 壁虎:79%
      • webkit:89%

      这些统计数据本身并不能证明该领域的优化会有所帮助或有多大帮助,因为还有不成对的添加和删除、对我们考虑的基名的限制等,但它确实激发了这个想法在这方面尝试一下。

      还有:

      diffcore-rename:完成find_basename_matches()

      签字人:Elijah Newren

      在现实世界的存储库中,大多数文件重命名不更改文件的基本名称并不罕见;即

      大多数“重命名”只是将文件移动到不同的目录。

      我们可以利用这一点来避免将所有重命名源候选者与所有重命名目标候选者进行比较,方法是首先将源与具有相同基本名称的目标进行比较。

      • 如果两个具有相同基本名称的文件足够相似,我们记录重命名; - 如果没有,我们会将这些文件包含在更详尽的矩阵比较中。

      这意味着我们正在添加一组初步的附加比较,但对于每个文件,我们最多只将其与另一个文件进行比较。

      例如,如果有一个 include/media/device.h 被删除和一个 src/module/media/device.h 被添加,并且在精确重命名检测后剩余的添加和删除文件集中没有其他 device.h 文件,那么这些两个文件将在初步步骤中进行比较。

      这个提交实际上并没有使用这个新的优化,它只是添加了一个可以用于这个目的的函数。

      请注意,与不进行优化相比,这种优化可能会给我们带来不同的结果,因为尽管具有相同基本名称的文件足够相似而被视为重命名,但没有相同基本名称的文件之间可能会更好地匹配。

      我认为这是可以的,原因有四个:

      • (1) 很容易向用户解释发生了什么,如果它确实发生了(或者甚至让他们直观地弄清楚),
      • (2) 下一个补丁将显示它提供了如此大的性能提升,值得权衡,并且
      • (3) 尽管具有唯一匹配的基本名称,但其他文件不太可能作为更好的匹配项。
        理由(4)用整段来解释……

      如果前三个原因还不够,请考虑重命名检测已经做了什么。
      中断检测不是默认设置,这意味着如果文件具有相同的_fullname_,,那么即使它们相似度为 0%,它们也被认为是相关的。
      事实上,在这种情况下,我们甚至不会费心比较文件来查看它们是否相似,更不用说将它们与所有其他文件进行比较以查看它们最相似的部分。

      基本上,我们会根据足够的文件名相似性来覆盖内容相似性
      如果没有文件名相似度(目前实现为文件名的精确匹配),我们将钟摆向相反方向摆动,并说文件名相似度无关紧要,并比较源和目标的完整 N x M 矩阵以找出最相似的内容.
      这种优化只是增加了另一种形式的文件名相似性比较,但也增加了文件内容相似性检查。
      基本上,如果两个文件具有相同的基本名称并且足够相似以被视为重命名,则将它们标记为这样,而不会将这两个文件与所有其他重命名候选者进行比较。

      这导致:

      diffcore-rename:指导基于基本名称的不精确重命名检测

      签字人:Elijah Newren

      利用最后两个补丁中添加的新 find_basename_matches() 函数,在我们可以根据基本名称匹配文件的情况下更快地找到重命名。

      作为一个快速提醒(有关更多详细信息,请参阅最后两条提交消息),这意味着例如,如果在添加的其他地方没有剩余的“extensions.txt”文件,docs/extensions.txtdocs/config/extensions.txt 被视为可能重命名和删除的文件,如果相似性检查确认它们相似,则将它们标记为重命名,而无需在其他文件中寻找更好的相似性匹配。

      这是一种行为变化,在之前的提交消息中有更详细的介绍。

      我们不会将此启发式方法与中断或复制检测一起使用。

      断点检测是说文件名相似度并不意味着文件内容相似度,我们只想知道文件内容相似度。

      复制检测的重点是使用更多资源来检查额外的相似性,而这是一种使用更少资源但也可能导致发现的相似性略少的优化。

      因此,此优化背后的想法与这两个功能都背道而驰,并且将对这两个功能都关闭。

      对于commit 557ac03 中提到的测试用例(“merge-ort:开始性能工作;使用trace2_region_* 调用的仪器”,2020-10-28,Git v2.31.0-rc0 -- merge 在@987654337 中列出@),此更改对性能的改进如下:

      Before                  After
       s ±  0.062 s    13.294 s ±  0.103 s
       s ±  0.493 s   187.248 s ±  0.882 s
       s ±  0.019 s     5.557 s ±  0.017 s
      

      使用 Git 2.32(2021 年第二季度),重命名检测返工继续进行。

      commit 81afdf7commit 333899ecommit 1ad69ebcommit b147301commit b6e3d27commit cd52e00commit 0c4fd73commit ae8cf74commit ae8cf74commit bde8b9fcommit 37a2514@@ (27) 987654348@.
      (由 Junio C Hamano -- gitster -- 合并于 commit dd4048d,2021 年 3 月 22 日)

      diffcore-rename:从 dir_rename_counts 计算 dir_rename_guess

      审核人:Derrick Stolee
      签字人:Elijah Newren

      dir_rename_counts有一个映射的映射,特别是它有

      old_dir => { new_dir => count }
      

      我们想要一个简单的映射

      old_dir => new_dir
      

      基于给定old_dir 中哪个new_dir 的计数最高。
      计算它并将其存储在dir_rename_guess

      这是我们猜测在基本名称不唯一时将文件移动到哪个目录所需的最后一块拼图。

      (最后一张based on commit 37a2514

      对于commit 557ac03 中提到的测试用例(“merge-ort:开始性能工作;使用trace2_region_* 调用的仪器”,2020-10-28,Git v2.31.0-rc0 -- merge 在@987654355 中列出@),此更改对性能的改进如下:

      Before                  After
       s ±  0.062 s    12.596 s ±  0.061 s
       s ±  0.284 s   130.465 s ±  0.259 s
       s ±  0.019 s     3.958 s ±  0.010 s
      

      仍然使用 Git 2.32(2021 年第二季度),通过跳过不相关的重命名优化了 ort 合并后端。

      请参阅commit e4fd06ecommit f89b4f2commit 174791fcommit 2fd9edacommit a68e6cecommit beb0614commit 32a56dfcommit 9799889(2021 年 3 月 11 日)Elijah Newren (newren)
      (由Junio C Hamano -- gitster -- 合并于commit 1b31224,2021 年 4 月 8 日)

      merge-ort:如果可能,完全跳过重命名检测

      签字人:Elijah Newren

      diffcore_rename_extended() 将进行一系列设置,然后检查准确的重命名,如果没有更多需要匹配的源或目标,则在不准确的重命名检测之前中止。
      然而,有时情况是这样的,要么

      • 我们既不从任何来源或目的地开始
      • 我们从没有相关来源开始>在这两种情况中的第一种情况下,设置和准确的重命名检测将非常便宜,因为有 0 个文件要操作。
        在第二种情况下,很可能有数千个文件与源文件都不相关。
        当我们可以确定不需要重命名检测时,避免调用diffcore_rename_extended() 甚至是diffcore_rename_extended() 之前的一些设置。

      对于commit 557ac03 中提到的测试用例(“merge-ort:开始性能工作;使用trace2_region_* 调用的仪器”,2020-10-28,Git v2.31.0-rc0 -- merge 在@987654370 中列出@),此更改对性能的改进如下:

      Before                  After
       s ±  0.048 s     5.708 s ±  0.111 s
       s ±  0.236 s   102.171 s ±  0.440 s
       s ±  0.017 s     3.471 s ±  0.015 s
      

      这项工作在 Git 2.33(2021 年第三季度)继续进行,其中优化了一系列合并操作中的重复重命名检测。

      commit 25e65b6commit cbdca28commit 86b41b3commit d509802commit 19ceb48commit 64aceb6commit 2734f2ecommit d29bd6dcommit d29bd6dcommit a22099fcommit f950026,@989 @(2021 年 5 月 20 日)和 commit 15f3e1e(2021 年 5 月 4 日)Elijah Newren (newren)
      (由 Junio C Hamano -- gitster -- 合并到 commit 169914e,2021 年 6 月 14 日)

      merge-ort, diffcore-rename: 尽可能使用缓存重命名

      签字人:Elijah Newren

      当一系列提交的旧基数和新基数之间有许多重命名时,sequencer.cmerge-recursive.cdiffcore-rename.c 传统上拆分工作的方式导致重新检测相同的重命名每一个提交都被移植。
      为了解决这个问题,最近的几次提交一直在创建重命名检测结果的缓存,确定在后续合并操作中何时可以安全使用此类缓存,添加辅助函数等等。

      对于commit 557ac03 中提到的测试用例(“merge-ort:开始性能工作;使用trace2_region_* 调用的仪器”,2020-10-28,Git v2.31.0-rc0 -- merge 在@987654393 中列出@),此更改对性能的改进如下:

      Before                  After
       s ±  0.129 s     5.622 s ±  0.059 s
       s ±  0.158 s    10.127 s ±  0.073 s
      ms ±  6.1  ms   500.3  ms ±  3.8  ms
      

      这是一个相当小的改进,但主要是因为之前的优化对这些特定的测试用例非常有效;此优化仅在其他优化不启动时才会启动。
      如果我们取消 basename-guided rename detection 和 skip-irrelevant-renames 优化,那么我们会看到这个系列本身提高了性能,如下所示:

      Before Basename Series   After Just This Series
        13.815 s ±  0.062 s      5.697 s ±  0.080 s
      1799.937 s ±  0.493 s    205.709 s ±  0.457 s
      

      由于此优化有助于加速以前的优化不适用的情况,最后的比较表明,这种缓存重命名优化有可能在不满足其他优化要求的情况下显着帮助有效。


      使用 Git 2.33(2021 年第三季度),对“merge -sort”进行了更多修复和优化。

      参见Elijah Newren (newren)commit ef68c3dcommit 356da0fcommit 61bf449commit 5a3743d(2021 年 6 月 8 日)。
      (由 Junio C Hamano -- gitster -- 合并于 commit 89efac8,2021 年 7 月 16 日)

      merge-ort:用更快的替代品替换 string_list_df_name_compare

      签字人:Elijah Newren
      审核人:Derrick Stolee

      以在比较字符串时不需要找出字符串长度的方式重写比较函数。
      在此过程中,针对我们的具体情况调整代码——例如,无需处理各种模式。
      这些更改的组合将在巨型重命名情况下花费在“plist 特殊排序”中的时间减少了约 25%。

      对于commit 557ac03 中提到的测试用例(“merge-ort:开始性能工作;使用trace2_region_* 调用的仪器”,2020-10-28,Git v2.31.0-rc0 -- merge 在@987654404 中列出@),此更改对性能的改进如下:

      Before                  After
       s ±  0.059 s     5.235 s ±  0.042 s
       s ±  0.073 s     9.419 s ±  0.107 s
      ms ±  3.8  ms   480.1  ms ±  3.9  ms
      

      而且,仍然使用 git 2.33:

      请参阅commit 2bff554commit 1aedd03commit d331dd3commit c75c423(2021 年 6 月 22 日)和commit 78cfdd0(2021 年 6 月 15 日)Elijah Newren (newren)
      (由@987654411 合并@in commit fdbcdfc,2021 年 7 月 16 日)

      diffcore-rename:使用不同的预取进行基本名称比较

      签字人:Elijah Newren

      merge-ort 旨在最大限度地减少所需和使用的数据量,并对 diffcore-rename 进行了一些更改,以利用额外的元数据来实现数据最小化(特别是用于跳过“无关”的 relevant_sources 变量重命名)。
      这一努力显然成功地大大减少了计算时间,但理论上也应该允许部分克隆下载更少的信息。
      不过,以前,diffcore-rename 中使用的“prefetch”命令从未被修改过,并且下载了许多对于 merge-ort 来说不必要的 blob。
      此提交纠正了这一点。

      在进行基本名称比较时,我们只想获取将用于基本名称比较的对象。
      如果在提取基本名称之后,我们没有更多相关的源(或没有更多的目标),那么我们就不需要进行完全不精确的重命名检测,并且可以跳过下载额外的源和目标文件。
      即使我们必须在以后进行完全不精确的重命名检测,在基本名称匹配之后和完全不精确的重命名检测之前剔除不相关的源,所以我们仍然可以避免下载不相关源的 blob。
      prefetch() 重命名为inexact_prefetch(),并引入一个新的basename_prefetch() 以利用这一点。

      如果我们从commit 557ac03修改测试用例(“merge-ort:开始性能工作;使用trace2_region_*调用的仪器”,2021-01-23,Git v2.31.0-rc0 -- merge列在@ 987654416@) 通过

      --sparse --filter=blob:none
      

      clone 命令,并使用之前几次提交的新 trace2 "fetch_count" 输出来跟踪调用的 fetch 子命令的数量和在所有这些 fetch 中获取的对象数量,然后用于超重命名测试用例我们观察到以下内容:

      在此提交之前,重新调整 35 个补丁:

      strategy     # of fetches    total # of objects fetched
      ---------    ------------    --------------------------
      recursive    62              11423
      ort          30              11391
      

      在这次提交之后,重新定位相同的 35 个补丁:

      ort          32                 63
      

      这意味着新代码只需要下载少于 2 个 blob 的补丁即可。
      这特别有趣,因为一开始存储库只下载了大约六个 TOTAL blob(因为仅使用顶级目录的默认稀疏签出)。

      因此,对于这个特定的 linux 内核测试用例,上游端 (drivers/ -> pilots/) 涉及约 26,000 次重命名,其中 35 个补丁被重新定位,此更改减少了需要下载的 blob 数量约 180 倍。

      也在 Git 2.33 中:

      使用 Git 2.33(2021 年第三季度),进一步优化“合并排序”后端。

      参见commit 8b09a90commit 7bee6c1commit 5e1ca57commit e0ef578commit d478f56commit 528fc51commit 785bf20(2021 年 7 月 16 日)Elijah Newren (newren)
      (合并Junio C Hamano -- gitster --commit 1a6fb01,2021 年 8 月 4 日)

      merge-ort:使用缓存的重命名重新启动合并以降低进程进入成本

      签字人:Elijah Newren

      合并算法主要由以下三个函数组成:

      collect_merge_info()
      detect_and_process_renames()
      process_entries()
      

      在最后六次提交的微不足道的目录解析优化之前,process_entries() 一直是最慢的,其次是collect_merge_info(),然后是detect_and_process_renames()
      当应用微不足道的目录解析时,它通常会大大减少花费在两个较慢函数上的时间。

      但是,盯着这个函数列表并注意到 process_entries() 是最昂贵的,并且知道如果我有缓存重命名可以避免它,这提出了一个简单的想法:更改

      collect_merge_info()
      detect_and_process_renames()
      process_entries()
      

      进入

      collect_merge_info()
      detect_and_process_renames()
      <cache all the renames, and restart>
      collect_merge_info()
      detect_and_process_renames()
      process_entries()
      

      这可能看起来很奇怪,而且看起来需要更多的工作。
      但是请注意,虽然我们运行了两次collect_merge_info(),但第二次我们使用普通目录解析,这使得它更快,所以collect_merge_info() 增加的时间很小。
      当我们再次运行detect_and_process_renames() 时,所有重命名都被缓存了,所以它几乎是一个空操作(我们不调用diffcore_rename_extended(),但我们确实有一些数据结构检查和修复)。
      最大的回报来自process_entries(),由于要处理的条目要少得多,因此速度会更快。

      只有当我们可以将递归保存到足够多的目录中以使其值得我们花时间时,这种重新启动才有意义。
      引入一个简单的启发式来指导这一点。

      对于commit 557ac03 中提到的测试用例(“merge-ort:开始性能工作;使用trace2_region_* 调用的仪器”,2020-10-28,Git v2.31.0-rc0 -- merge 在@987654430 中列出@),此更改对性能的改进如下:

      Before                  After
      ms ±  3.8  ms   204.2  ms ±  3.0  ms
       s ±  0.010 s     1.076 s ±  0.015 s
      ms ±  3.9  ms   364.1  ms ±  7.0  ms
      

      使用 Git 2.34(2021 年第四季度),最后一批“merge -sort”优化。

      commit 62a1516(2021 年 7 月 31 日)和 commit 092e511commit f239fffcommit a8791efcommit 6697ee0commit 4137c54commit cdf2241commit fa0e936、@98760221@(7 月 30 日) by Elijah Newren (newren).
      (由 Junio C Hamano -- gitster -- 合并于 commit 08ac213,2021 年 8 月 24 日)

      merge-ort:将我们的 strmap 切换到使用内存池

      签字人:Elijah Newren

      对于作为clear_or_reinit_internal_opts() 的一部分无条件释放内存的所有strmaps(包括strintmapsstrsets),将它们切换为使用我们的新内存池。。 p>

      对于commit 557ac03 中提到的测试用例(“merge-ort:开始性能工作;使用trace2_region_* 调用的仪器”,2020-10-28,Git v2.31.0-rc0 -- merge 在@987654446 中列出@),此更改对性能的改进如下:

      Before                  After
      ms ±  3.2  ms    198.1 ms ±  2.6 ms
       s ±  0.012 s    715.8 ms ±  4.0 ms
      ms ±  3.9  ms    276.8 ms ±  4.2 ms
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-11
        • 2012-10-29
        • 2013-12-05
        • 2011-04-24
        • 2016-05-09
        • 1970-01-01
        • 2011-12-07
        • 2016-04-15
        相关资源
        最近更新 更多