【问题标题】:Git submodules : must a file located in a submodule's folder be tracked by that same submodule?Git子模块:位于子模块文件夹中的文件必须由同一个子模块跟踪吗?
【发布时间】:2019-07-08 16:20:34
【问题描述】:

我有包含子模块 B 的 git repo A。一些文件 file.c 位于 B 的文件夹内,如您所料,它本身位于 A 的文件夹内。问题:我可以从 A 而不是 B 跟踪此文件 file.c 吗?这有什么意义吗?

想法是 B 的任何用户都必须在 B 的文件夹层次结构的这个特定位置添加他们自己的 file.c。如果有人没有这样做但仍然添加 B 作为子模块,B 将简单地提及编译/运行时没有目标文件。

【问题讨论】:

    标签: git git-submodules git-add


    【解决方案1】:

    我有包含子模块 B 的 git repo A。

    换句话说,你可能有:

    $ cd /path/to/A
    $ ls
    B/    README
    

    对于(有点傻)的例子。 (这里还有一个.gitmodules,但它被隐藏了,因为它是一个点文件。)

    A 文件file.c 位于 B 的文件夹内,如您所料,它本身位于 A 的文件夹内。问题:我可以从 A 而不是 B 跟踪此文件吗?这有什么意义吗?

    问题是有道理的,但答案是一个响亮的轰隆隆)。问题在于子模块 B 的存在在存储库 A 中的表示方式。

    存储库 A 的当前 (HEAD) 提交有一个 tree 对象,该对象声称至少存在两个 blob 对象:

    • .gitmodules:这个文件中有一个存储库的 URL,以及一个 path 条目,上面写着 B
    • B:这个 blob 的模式为 160000(一个“gitlink”条目)。这个 blob 的“内容”是 Git 应该检查的提交哈希 ID,一旦 Git 克隆了 URL 以便 B/ 存在。据推测,检查该哈希 ID 会为您获取一个名为 file.c 的文件,因此 B/file.c 存在。

    要存储将被提取到超级项目A 中的B/file.c 的blob 的存在,Git 需要在顶层树中存储第二个名为Btree 对象(这第二个@987654338 @object 本身将有一个名为 file.c 的 blob,然后将其提取到 B/file.c)。但是已经有一个名为B的gitlink blob对象,所以不能:不允许重名。

    想法是 B 的任何用户都必须在 B 文件夹层次结构的这个特定位置添加他们自己的 file.c。如果有人没有这样做但仍然添加 B 作为子模块,B 将简单地提及编译/运行时没有目标文件。

    您可以做的是在子模块存储库 B 中存储一个名为file.c符号链接,指向../user-supplied-file.c../user/file.c 或类似的东西。现在存储库 A 需要包含 user-supplied-file.cuser/file.c 或链接指向的任何内容。

    请注意,这将子模块与超级项目紧密结合在一起。在这一点上,根本不理会子模块可能更合理。库和其他此类具有子模块价值的项目通常不需要额外的源代码;它们可能具有采用函数指针的例程,并通过这些指针调用这些函数,但它们没有完全外部的源依赖关系。

    【讨论】:

      猜你喜欢
      • 2019-02-16
      • 2010-11-08
      • 1970-01-01
      • 2012-04-20
      • 2015-09-13
      • 2013-07-28
      • 2012-02-29
      • 2010-11-28
      相关资源
      最近更新 更多