首页 > 解决方案 > 大型monorepos上的Git和稀疏签出-隐藏稀疏签出规范的无关更改?(git-diff、git-log 等)

问题描述

随着 git 越来越多地被宣传(和增强)以更好地支持非常大的存储库(所谓的“monorepos”),最近对稀疏签出工作流程进行了重大增强(git-sparse-checkout 命令和部分克隆/承诺/--filter ),我很惊讶在处理提交历史记录时找不到利用稀疏签出配置/规范的方法

我看到该主题已在之前的问题中部分提出:

唯一的答案提出了每个命令的路径过滤器,但是.git/info/sparse-checkout如果不是不可能的话,将规范转换为路径过滤器通常是不平凡的。

缺乏稀疏结帐支持似乎特别成问题git diff,在大型单仓库中,由于所有其他团队/区域的更新,两个相当远的仓库版本之间的差异可能会被严重掩盖,或者实际上无法访问,当命令行上的简单路径过滤器不可行。这主要是一个可读性/可达性/可用性问题,但当您对树的选择及其所有重命名源感兴趣时,大概也有一个性能组件。

有谁知道使用稀疏检出配置来限制/范围导致git diff(在提交之间)和其他类似的工具git log是可能的,和/或这种可能性是否在起作用?

标签: gitmonoreposparse-checkout

解决方案


从评论:

我可以以仅返回影响我的稀疏结帐锥的提交的方式运行“ git log”(或git diff在任意提交范围之间)吗?

您可以显示文件夹的日志,并从那里仅列出从该日志中列出的提交之间的差异。

据我所知,限制git diff来自锥文件夹的提交的本地方法不在工作中。


一些命令(状态/差异)在 Git 2.34+(2021 年第四季度)和Git 2.34 中引入稀疏索引时会运行得更好:它们只会处理稀疏锥的文件和索引。

它不会改变最初的答案(在稀疏锥体中,您需要执行 agit log -- aConeFolder才能获得相关的提交)
但它会显着提高工作树和索引相关命令(diff、status、... )

可以想象,即使您在大型存储库的一个小角落工作,索引仍然必须跟踪存储库的全部内容,而不仅仅是您正在工作的部分。

不幸的是,这种开销加起来了:每次 Git 需要处理索引时,它都需要解析并写出大量数据,这些数据不会影响稀疏检出之外的存储库部分。

通过添加启用稀疏的索引,此版本中的情况发生了变化。

与以前版本的索引不同,此版本允许索引仅跟踪您关心的存储库部分。
具体来说,它只包含部分存储库的条目,这些部分要么位于稀疏签出中,要么位于稀疏签出与存储库其余部分之间的边界。

折叠到稀疏索引 - https://github.blog/wp-content/uploads/2021/11/Fig-9-collapsing-to-sparse-index.png

三角形代表树,方框代表斑点。

  • 左:非稀疏索引内容的表示。
  • 右:稀疏化索引。

这里的高级细节是索引格式现在可以理解特殊标记的目录指示稀疏检出的内容与未检出的存储库部分之间的边界。

所以git diff// status... 现在应该只对您需要的稀疏数据进行操作(在您的稀疏锥内结帐索引),而不是处理完整的索引。

来自Derrick Stolee的“使用 Git 的稀疏索引让你的 monorepo 感觉很小”的更多详细信息。


推荐阅读