【问题标题】:Set Git submodule to shallow clone & sparse checkout?将 Git 子模块设置为浅克隆和稀疏结帐?
【发布时间】:2011-09-08 11:26:57
【问题描述】:

许多供应商的 Objective-C 库(例如,facebook-ios-sdk)指示您将其 repo 文件/目录的某个子集复制到您的 Xcode 项目中。这样做的一个问题是您不知道您拥有的供应商代码的修订版本。另一个是,如果您对供应商代码进行更改,那么通过 Git 贡献您的更改并不容易。

作为一种解决方案,我想将每个供应商库添加为我的项目 repo 的 Git 子模块,并带有一些额外的设置(例如,在 .gitmodules 文件中)。这样,如果另一个人克隆我的项目并执行git submodule update --init,他们的 repo 和子模块将具有与我相同的状态,因为他们将使用我设置的相同默认设置:

  1. 稀疏检出:只检出子模块的某些文件。
  2. 浅克隆:只克隆子模块的某个SHA1。

如何为 Git 子模块设置上述设置?

【问题讨论】:

标签: git github clone git-submodules sparse-checkout


【解决方案1】:

使用git1.8.4 (July 2013),在addition git shallow update for submodule (git submodule update --depth 1) 中,您现在可以进行自定义更新

除了从“rebase、merge 或 checkout-detach”中选择之外,“子模块更新”还允许使用自定义命令通过“submodule.*.update”配置变量来更新子模块的工作树。

commit 6cb5728c43f34a7348e128b44b80d00b9417cb19:

用户可以将submodule.$name.update 设置为“!command”,这将导致运行“command”,而不是结帐/合并/变基。
这允许用户更细粒度地控制更新的完成方式。

签字人:Chris Packham <judge.packham@gmail.com>

这意味着您可以对“command”进行版本控制,然后您可以将其用于任何子模块更新(通过submodule.$name.update 设置)。
如果您愿意,该脚本可以进行稀疏结帐。


2016 年 8 月更新(3 年后)

使用 Git 2.10(2016 年第三季度),您将能够做到

 git config -f .gitmodules submodule.<name>.shallow bool

请参阅“Git submodule without extra weight”了解更多信息。

【讨论】:

  • VonC,但是您究竟建议使用什么命令来执行稀疏结帐?我不知道它是什么。
  • @ThomasVanderStichele 一个执行稀疏结帐的脚本,类似于这个:stackoverflow.com/a/2340860/6309
  • !command 不再起作用:“请注意,出于安全原因,此处有意忽略 !command 表单。”
  • @saji 您在哪个上下文/操作系统/策略中看到了! (shell 执行)出于安全原因被忽略?
  • @VonC 我的错。似乎submodule.&lt;name&gt;.update 中的!command 形式在gitmodules 中是不允许的,但在“常规”配置文件中是is fine。这是有道理的,因为.gitmodules 被提交而.git/config 不是。
【解决方案2】:

您可以像normal sparse checkout 一样对子模块进行稀疏签出。请记住每个模块的sparse-checkout 文件位于.git/modules/&lt;mymodule&gt;/info/ 中。但是,正如git 1.7 sparse checkout feature 中所讨论的那样,稀疏结帐正是:结帐。您无法移动文件或共享设置。

【讨论】:

【解决方案3】:

子模块不能做回购的部分。您应该改为查看subtree merge

【讨论】:

  • 此评论是关于旧版本的 git,因此不再有效
猜你喜欢
  • 1970-01-01
  • 2017-06-07
  • 2019-03-02
  • 1970-01-01
  • 2020-11-23
  • 2020-06-26
  • 2012-03-23
  • 1970-01-01
相关资源
最近更新 更多