我有一个包含多个子模块的 git 项目(回想起来我有点后悔这个选择)。它使用 gnu make
目前我希望人们在第一次构建项目之前以及在 pull 任何更新了 a 的更改之后手动发布 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
参数,这具有相同的效果。
最佳答案
我设计了这样的东西:
.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/