git - Makefile中子模块的自动初始化和更新

标签 git makefile gnu-make git-submodules

我有一个包含多个子模块的 git 项目(回想起来我有点后悔这个选择)。它使用 gnu make

目前我希望人们在第一次构建项目之前以及在 pull 任何更新了 a 的更改之后手动发布 git submodule update --init1子模块引用。

但是,我希望 Makefile 在需要时自动发出这些命令。如果他们有时在不需要时发出命令(虚假更新)也没关系 - 但它不应该经常发生。

对于初始的 init 来说,似乎有一个规则就足够了(对于目录 module1 中的子模块:

module1/.git:
    git submodule update --init

这里选择 .git 作为“代表”子模块的文件是相当随意的,它可以是其他文件。

但是,当引用已更新时,更新子模块的效果并不好。我想我可以让子模块依赖于根 .gitmodules 文件,我想当子模块引用更新时它应该改变,比如:

module1/.git: .gitmodules
    git submodule update --init

不过,这里使用 .git 似乎是错误的:大概当 update 运行时,直接不一定会更新(特别是如果没有更新这个特定的子模块),这将使更新命令每次都运行。

在这里寻找更清洁的解决方案。


1 或者可能在初始克隆 上使用--recursive 参数,这具有相同的效果。

最佳答案

我设计了这样的东西:

.PHONY: check-and-reinit-submodules
check-and-reinit-submodules:
    @if git submodule status | egrep -q '^[-]|^[+]' ; then \
            echo "INFO: Need to reinitialize git submodules"; \
            git submodule update --init; \
    fi

它使用 git submodule status,来确定子模块是否未初始化(- 开头)或以某种方式修改/过时(+开头)。这个 make 目标会一直运行,但是 git submodule update --init 只会在需要的时候运行。

关于git - Makefile中子模块的自动初始化和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52337010/

相关文章:

git - Azure DevOps API - 从位于特定分支源中的 YAML 文件创建管道

git - Azure 上的 Bitbucket 持续部署不起作用

c++ - 如何将 qmake 文件与谷歌测试和共享库一起使用

c - 向 libbluray 添加函数时 undefined reference

makefile - (M|m)akefile 语义是什么?

git - 如何在不使用 gitcherry-pick 的情况下解决此补丁发布问题?

c++ - 我的 linux c++ gnu makefile 变量扩展不符合我的预期

c - 我怎样才能重现这个 DDD 测试?

go - 生成后的模板标识

git - 查找两次提交的第一个普通 child