Bee*_*ope 8 git makefile gnu-make git-submodules
我有一个带有几个子模块的git项目(回想起来我有点后悔的选择).它使用gnumake
目前,我希望人们在第一次构建项目之前手动发布git submodule update --init1,并且在提取任何更新子模块引用的更改之后.
但是,我希望Makefile在需要时自动发出这些命令.如果他们有时在不需要时发出命令(虚假更新),这是可以的 - 但它不应该经常发生.
对于初始init,似乎有足够的规则(对于存在于目录中的子模块module1:
module1/.git:
git submodule update --init
Run Code Online (Sandbox Code Playgroud)
在这里选择.git作为"表示"子模块的文件是相当随意的,它可能是一些其他文件.
但是,在更新引用时更新子模块效果不佳.我想我可以让子模块依赖于根.gitmodules文件,我想在子模块引用更新时应该更改,例如:
module1/.git: .gitmodules
git submodule update --init
Run Code Online (Sandbox Code Playgroud)
这里使用.git似乎是错误的:可能是在update运行时不一定直接更新(特别是如果没有更新此特定子模块),这将使更新命令每次都运行.
在这里寻找更清洁的解决方案.
1或者可能--recursive在初始化上使用参数clone,这具有相同的效果.
我制作了这样的东西:
.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
Run Code Online (Sandbox Code Playgroud)
它使用git submodule status来确定子模块是否未初始化(-在开始处)或以某种方式修改/过时(+在开始处)。这个make目标将始终运行,但git submodule update --init仅在需要时运行。