Ber*_*ann 7 git git-submodules
我们如何检查出一个git的承诺,包括子模块,因为他们在那个时候?
我们之所以希望这样做的一个原因是查看主程序的先前版本,我们需要使用提交时使用的版本中的子模块对其进行重建。
有了这个,我们甚至可以在常规工作流程中使用它:
git submodule update --remote --merge,然后尝试构建以查看程序是否可以使用所有子模块的最新版本。我们可以通过手动查看每个子模块来做到这一点:哪个提交具有适当的时间戳(并希望程序使用当时最新的版本)。如果我们可以看到程序的提交X使用了子模块提交Y,那就更好了。并检查每个子模块的提交。
在这种情况下,您只需要在签出上一个提交后运行git submodule update --checkout(no --merge,no --remote)。
子模块周围存在很多混乱。但是,基础实际上很简单:
git clone为.gitmodules文件中的每个子模块记录URL和路径-这些通常是您通常可以通过运行来控制或提供的东西。这具有将适当的子模块提交“冻结”到每个超级项目提交中的效果。它是(或最初是)旨在管理第三方代码的,与超级项目相比,子模块本身的更改很少。
该模型一点也不灵活,并且不适合许多人想要使用子模块的方式,子模块只能使子模块处于某个分支的顶端。因此,子模块增强了更新到分支名称或可以使用的功能,并且可以重新设计和/或合并工作。这些新功能催生了配置条目和选项。submodule.name.updategit submodule update --remote
如果您尚未配置这些项目中的任何一项,则git submodule update仅将为当前记录的每个子模块(即,HEAD超级项目的提交)签出所需的(记录的)子模块提交。如果已经配置了其中一些,则可以使用git submodule update --checkout覆盖配置并在每个子模块中引起。请注意,即使条目已经存在,添加也可使Git执行此子模块检出。但是,由于每个子模块都是其自己的Git存储库,因此该子模块的签出与自己的(每个存储库/每个工作树)索引和工作树具有自己的交互作用。2git checkout hash-id--forceHEAD
同样,每个子模块都是其自己的Git存储库,这意味着当前超级项目的子模块可能具有其自己的子模块。如果是这样,那么这也会使子模块也成为一个超级项目,这也是--recursive标记所在的位置。如果您不嵌套子模块,那么这种复杂性都不会影响您。
1换句话说,超级项目的索引为每个子模块都有一个条目。该索引条目的类型是“ gitlink”,它存储从HEAD子模块中读取的SHA-1 。这些gitlink条目被视为符号链接和目录之间的怪异交叉。
2换句话说,如果您手动输入了一个子模块并修改了索引和/或工作树,则该子模块内的git checkout运行(如果有)可能仍会将您的修改带入新的检出提交中。