Git子模块:必须由同一个子模块跟踪位于子模块文件夹中的文件吗?

时间:2017-05-22 09:10:22

标签: git git-submodules git-add

我有一个包含子模块B的git repo A.文件file.c位于B&#39s文件夹内,它本身位于A&#39文件夹中,正如您所期望的那样。问题:我可以从A而不是从B跟踪此文件吗?这甚至没有任何意义吗?

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

1 个答案:

答案 0 :(得分:2)

  

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

换句话说,你可能有:

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

(略显愚蠢)的例子。 (此处还有一个.gitmodules,但它隐藏起来,因为它是一个点文件。)

  

文件file.c位于B&#39的文件夹内,本身就在A&#39文件夹中,正如您所期望的那样。问题:我可以从A而不是从B跟踪此文件吗?这甚至没有任何意义吗?

问题是有道理的,但回答是一个响亮的繁荣,砰的)。问题是子模块B的存在在存储库A中的表示方式。

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

  • .gitmodules:此文件中包含存储库的网址,以及显示path
  • B条目
  • B:此blob具有模式160000(" gitlink"条目)。 "内容"这个blob是Git应该检出的提交哈希ID,一旦Git克隆了URL以便B/存在。据推测,检查该哈希ID会得到一个名为file.c的文件,以便B/file.c存在。

要存储将在超级项目B/file.c中提取到A的blob,Git需要在其中存储名为tree的第二个B对象。顶级树(第二个tree对象本身会有一个名为file.c的blob,然后将其提取到B/file.c中)。但是已经有一个名为blob的gitlink B对象,因此它不能:禁止重复的名称。

  

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

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

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