设置Git子模块为浅克隆和稀疏检验?

34
许多供应商的Objective-C库(例如facebook-ios-sdk)会指示您将其存储库的某个子集的文件/目录复制到您的Xcode项目中。其中一个问题是,您不知道供应商代码的哪个版本。另一个问题是,如果您更改供应商代码,则不容易通过Git共享您的更改。
为解决此问题,我想将每个供应商库作为我的项目存储库的Git子模块添加,并添加一些额外的设置(比如在.gitmodules文件中)。这样,如果另一个人克隆我的项目并执行git submodule update --init,他们的存储库和子模块将具有与我的相同的状态,因为他们将使用我设置的相同默认设置:
  1. 稀疏检出:仅检出子模块的某些文件。
  2. 浅克隆:只克隆子模块的某个SHA1。
如何为Git子模块设置上述设置?

我不认为你可以这样做,但是你可以提交像这个脚本一样的脚本: https://dev59.com/k3I95IYBdhLWcg3wzRXv - Mauricio Scheffer
请注意,git submodule现在可以执行自定义更新:请参见我的下面的答案 - VonC
3个回答

23

git1.8.4(2013年7月)中,添加浅层更新子模块的gitgit submodule update --depth 1),现在您可以进行自定义更新

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

请参见commit 6cb5728c43f34a7348e128b44b80d00b9417cb19

用户可以将 submodule.$name.update 设置为 '!command',这将导致运行 'command' 而不是 checkout/merge/rebase。
这使得用户对更新的控制更加精细。

Signed-off-by: Chris Packham <judge.packham@gmail.com>

这意味着您可以版本化一个 'command',然后通过 submodule.$name.update 设置在任何子模块更新中使用该脚本。
如果需要,该脚本可以进行稀疏检出。


更新于2016年8月(三年后)

使用Git 2.10(2016年第三季度),您将能够执行以下操作:

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

请参见“无额外负担的Git子模块”获取更多信息。

1
VonC,您建议使用什么命令进行稀疏检出?我不知道这是什么。 - Thomas Vander Stichele
@ThomasVanderStichele 这是一个执行稀疏检出的脚本,类似于这个链接中的脚本:https://dev59.com/fHE95IYBdhLWcg3wY81l#2340860 - VonC
“!command”不再起作用:“请注意,出于安全原因,在此处有意忽略了“!command”形式。” - saji
@saji,在哪种上下文/操作系统/策略中,您看到!(shell execute)由于安全原因被忽略? - VonC
@VonC 我的错。在 submodule.<name>.update 中,似乎不允许使用 !command 格式在 gitmodules 中,但是在“常规”配置文件中 可以。这很有道理,因为 .gitmodules 是提交的,而 .git/config 不是。 - saji

23
你可以像普通的稀疏检出一样对子模块进行稀疏检出。只需记住每个模块的sparse-checkout文件位于.git/modules/<mymodule>/info/中。但是,正如git 1.7稀疏检出特性所讨论的那样,稀疏检出就是检出。你不能移动文件或共享设置。

1
创建一个子模块,然后使用稀疏检出功能过滤出出现在工作树中的文件/目录。这里有一个简单的如何在 Git 中进行稀疏检出的教程:http://blog.quilitz.de/2010/03/checkout-sub-directories-in-git-sparse-checkouts。 - johnhunter
3
@johnhunter 的链接已失效。 - void.pointer
有一份博客的版本存储在Wayback Machine上:https://web.archive.org/web/20150819045120/http://blog.quilitz.de/2010/03/checkout-sub-directories-in-git-sparse-checkouts - SAK

-1

子模块无法处理仓库的部分。您应该使用子树合并


18
这条评论是关于旧版的Git,因此已不再适用。 - Joakim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接