我有一个包含子模块B的git repo A.文件file.c位于B&#39s文件夹内,它本身位于A&#39文件夹中,正如您所期望的那样。问题:我可以从A而不是从B跟踪此文件吗?这甚至没有任何意义吗?
想法是B的任何用户都必须在B&#39的文件夹层次结构的特定位置添加自己的file.c.如果有人没有这样做但仍然将B添加为子模块,B只会提到编译/运行时没有目标文件。
答案 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.c
或user/file.c
或链接指向的任何内容。
请注意,这会将子模块与超级项目紧密耦合。在这一点上,根本不打扰子模块可能更合理。库和其他类似子模块的项目通常不需要额外的源代码;他们可能有使用函数指针的例程,并通过这些指针调用这些函数,但它们没有完全外部的源依赖关系。