Git:将子模块文件检出到单个目录中

Posted

技术标签:

【中文标题】Git:将子模块文件检出到单个目录中【英文标题】:Git: checkout submodule files into a single directory 【发布时间】:2013-02-11 10:27:52 【问题描述】:

使用 git 子模块可以将多个存储库作为子模块检出到各自的路径中,例如:

% git submodule add git@.../repo1.git ./here/is/1
% git submodule add git@.../repo2.git ./here/is/2

但是如果我需要将repo1repo2 的内容都检出到一个路径./here/is/3 中怎么办?

基本上,当用户执行git clone --recursive ... 时,我需要将所有子模块存储库都签出到客户端非常严格的目录层次结构中。

我希望将 所有 子模块的内容检出到 ./somepath。可以吗?

我考虑过的一件事是使用符号链接,但感觉不对。

编辑:

我希望将上面12的内容放在客户端的同一个目标目录下。我可以通过让用户在克隆后手动运行脚本 (it is not possible to have git track a single file) 来做到这一点,但似乎应该有一种更简洁的方法来做到这一点——为每个子模块手动创建符号链接需要做很多工作,而且似乎子模块抽象应该能够处理这个。

也许我的问题是伪装的?

【问题讨论】:

【参考方案1】:

一种方法是创建 another 父 repo,其中直接声明子模块:

newParentRepo/
  1/
  2/
  3/
  ...

该父 repo 可以在 ./somepath 中克隆 --recursive,子模块将直接位于 ./somepath 下(在它们各自的根目录中 1/2/、...)。

您需要将第一个父 repo 记录的子模块的 SHA1 同步到第二个父 repo,以便所述第二个 repo 记录正确的子模块 SHA1 列表。

【讨论】:

“在各自的根目录中”部分是个问题。我需要在git clone 之后将子模块中的所有垃圾移动(或链接)到客户端的任意位置。澄清我的问题以反映这一点。 @g33kz0r 我确认子模块总是克隆到它自己的目录中,而不是另一个子模块的目录中。每个子模块必须在它们自己的目录中。任何其他组织都是部署问题(复制/符号链接),但它与git无关了。 好的。看起来我必须创建符号链接先验,因为 Git 没有克隆后挂钩。 @g33kz0r 或者你可以通过一个脚本来创建它们,你可以声明为一个 post checkout hook。 对,但是钩子只在我的本地副本上运行。检查代码的任何其他人都不会从钩子中受益,因为它们既不受版本控制,也不受存储库 (github) 之间的共享。

以上是关于Git:将子模块文件检出到单个目录中的主要内容,如果未能解决你的问题,请参考以下文章

# git submodule

sh 将子模块添加到git项目

Git在添加主存储库之前恢复主存储库后未删除子模块

Git修改子模块的路径

Git如何检出指定目录或文件

单个文件作为 Git 子模块