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

时间:2018-09-14 17:51:17

标签: git makefile gnu-make git-submodules

我有一个带有几个子模块的git项目(回想起来,这个选择我有些后悔)。它使用gnu make

目前,我希望人们在首次构建项目之前以及在进行任何更新子模块引用的更改之后手动发布git submodule update --init 1

但是,我希望Makefile在需要时自动发出这些命令。如果他们有时在不需要它们时发出命令(没必要进行虚假更新),也可以-但它不应该定期发生。

对于最初的init,似乎有一条规则足以满足(对于位于目录module1中的子模块:

module1/.git:
    git submodule update --init

在这里,选择.git作为“表示”子模块的文件是相当随意的,而可能是其他文件。

但是,当引用已更新时,这对于更新子模块并不十分有效。我想我可以使子模块依赖于根.gitmodules文件,我猜它应该在子模块引用更新时更改,例如:

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

虽然在这里使用.git似乎是错误的:大概不一定会在运行update时直接进行更新(尤其是如果此特定子模块没有更新),这将导致每次运行都会更新命令。

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


1 或可能在初始--recursive上使用clone参数,其效果相同。

2 个答案:

答案 0 :(得分:5)

我制作了这样的东西:

.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仅在需要时运行。

答案 1 :(得分:-1)

您可以在更新子模块之前生成文件:

all: .gitmodules_updated my-target

.gitmodules_updated : .gitmodules 
     touch .gitmodules_updated
     git submodule update --init

如果.gitmodules被更新,它将变得比.gitmodules_updated更新,因此子模块也将被更新。