首页 > 解决方案 > 使用 git 子模块进行可重现的构建(依赖管理)?

问题描述

我正在尝试想出一种方法来处理 Git 项目依赖项,例如 Swift 包管理器。

我想特别说明一下,假设我的应用程序版本 1.2,取决于框架 A,版本 1.0。

然后,当我签出我的应用程序的 v1.2 时,框架代码应自动在标签 v1.0 处拉入。

code/myapp/               tag v1.2
           lib/frameworkA tag v1.0

我尝试了 Git 子模块,但是当我签出父应用程序的特定标签时,我无法找到一种自动签出特定子模块标签的方法。

.gitmodules 文件作为父项目的一部分签入。理想情况下,它将包含有关要使用子模块的哪个标签的详细信息。这可能吗?如果没有,是否有另一种不使用子模块的方法?

标签: gitdependency-managementgit-submodules

解决方案


默认情况下,git-checkout不更新子模块。

submodule.recurse但是,您可以通过将配置选项设置为从 Git 2.14 更改此行为true

submodule.recurse
指定命令是否默认递归到子模块中。这适用于所有具有--recurse-submodules选项的命令,除了clone. 默认为假。

从 Git 2.13 开始,git-checkout有了这个--recurse-submodules选项,所以你需要做的就是:

git config --global submodule.recurse true

git submodule update --recursive每当您切换到不同的分支时,Git 都会自动运行。

至于将子模块与特定标签相关联,您可以通过手动签出子模块目录中的标签来完成:

cd path/to/submodule
git checkout <submodule-tag-name>

此时,子模块将指向由<tag-name>. 然后,您所要做的就是告诉父项目修改后的子模块:

cd path/to/parent/project
git add path/to/submodule
git commit -m "Sets submodule to tag <submodule-tag-name>"
git tag -a <parent-tag-name>

从此时起,每当您<parent-tag-name>在父项目中签出时,Git 都会自动签出与子模块中关联的提交<submodule-tag-name>


推荐阅读