我对使用git的子模块功能感到非常沮丧。要么我仍然没有做对,要么就是因为我没想到这一点。项目情况如下:
Project
| .git
| projsrc
| source (submodule)
| proj.sln
在此方案中,源指向包含所有项目中的公共源数据的另一个存储库。在源下也有很多发展,在 projsrc 下也是如此。不幸的是,项目指向源子模块的某些提交,而不是它的实际HEAD。这是通常的git行为,据我所知。
我已经发现了
git submodule update
获取与主项目一起提交的子模块版本。但是,我真的希望始终与子模块开发保持同步,但是没有任何真正的线索如何做到这一点。因此我的问题是:
是否可以将项目附加到子模块的HEAD, 如果这会破坏Project的编译,则无论如何都是如此。 我只是不想总是进入子模块 目录并在那里做 git pull 。因为我认为我可以完成我的更改 在子模块目录中,因为这是简单的附加到一个 提交,而不是真正的任何分支左右。
请考虑以下约束:
答案 0 :(得分:8)
子模块指向特定修订的原因很重要。如果您指向HEAD,则构建将不可重现。即如果您查看昨天的项目版本,您永远不会知道昨天源@HEAD的确切版本。
这就是为什么它总是存储特定版本sha。
要提取所有子模块,您可以使用Easy way pull latest of all submodules
答案 1 :(得分:2)
我不擅长Git和子模块。但我认为一些简单的规则会非常有用。
答案 2 :(得分:2)
考虑一下:
进行子模块更新时,您希望在项目中出现哪一个?
在您的情况下,git的问题(和主要特性)是您认为提交和推送为原子操作。事实并非如此。 Git是分散的。没有共同的HEAD。您可能有多个具有不同HEAD的存储库。
考虑一下:
你认为哪个HEAD是“真正的”HEAD?
所以,回答你的问题:如果你想让公共源子模块始终与中央存储库同步,那么git不是你的选择。也许没有一个VCS可以帮助你。
您应该将git子模块视为第三方库,应该使用以下两个步骤手动更新:
如果要对子模块进行更改,则应按相反顺序执行相同的操作: