Git 子模块和拉取更改

Git submodules and pulling changes

我有一个 Alpha 项目依赖于另一个项目 DM。项目 DM 代表数据模型,也被其他项目使用。

我的团队决定将项目 DM 放在自己的 git 存储库中以避免 duplicate/diverging 代码,并将其作为子模块包含在项目 Alpha 的 git 存储库中。

当我修改项目DM对应的file1.txt时,位于/home/me/projects/Alpha/DM/file1.txt,运行ning

/home/me/projects/Alpha $ git status

产量:“modified: DM (new commits)”。

如果我理解得很好,做 $ git add DM$ git commit -m "Blo bli" 更新项目 Alpha 的提交指向的 DM 提交(因此,给定的项目 Alpha 提交知道它与哪个版本的 DM 兼容) .

那么,这是否意味着(在推送我的更改之后)如果我的团队中有人在项目 Alpha 运行s /home/teammate/my-projects/Alpha $ git pull 上工作,那么他的项目 Alpha 的文件将更新为最新提交并且 /home/teammate/my-projects/Alpha/DM/ 下的文件也将更新为与该提交对应的版本?他是否需要 运行 任何额外的命令来将子模块更新到正确的版本?

谢谢。

首先,一个观点:如果您将子模块视为主要只读的,并且只通过从上游远程拉取更改来更新它们,您会发现生活会简单得多。

If I understand well, doing $ git add DM and $ git commit -m "Blo bli" updates the DM commit that project Alpha's commit points to (so, a given project Alpha commit knows what version of DM it is compatible with).

答案是"sort of"。签出的子模块可能处于 "detached head" 状态,在这种情况下添加和提交文件不会做任何有用的事情(这部分是为什么我建议不要在子模块存储库中编辑文件)。假设您的本地子模块 在命名分支上,然后提交对父(Alpha)项目的消费者可见的更改,您将首先执行您描述的操作:

cd DM
git add my-changes
git commit -m 'some changes'
git push

thenparent仓库中提交记录子模块的新提交:

cd ..
git add DM
git commit -m 'updated DM submodule'
git push

在此之后,Alpha 存储库的新克隆将看到您更新的更改。现有结帐需要 运行:

git pull
git submodule update

您在此阶段只会在项目 DM 中进行新提交。 在项目 Alpha(以及其他项目)中,现在将更改子模块,并且随着 Alpha 的下一次提交,可以提交对子模块更改的引用。 因此:您必须在每个引用子模块的回购中进行额外的提交。

因为你想用 DM 的旧提交检查来自 Alpha 的旧提交,所以需要双重提交。

有关子模块的一些附加信息,您可以在 https://chrisjean.com/git-submodules-adding-using-removing-and-updating/