我想自动更新git子模块作为我们的构建系统的一部分,只要它不同步,即如果签出的版本与树中记录的版本不同。
目前我执行git submodule status ‹path›
并检查结果输出的第一个字符是空格(同步)还是其他内容(-
表示未初始化,+
表示无效-sync commit,或U
用于合并冲突。)
是否有更便宜的(在执行时间方面)命令来获取此信息?我是否可以比较两个适当选择的文件的时间戳来确定子模块是否需要更新?
答案 0 :(得分:1)
我不确定这会回答你的问题,但它可能有助于实现你的最终目标:
git submodule update --checkout [<submodule>]
这将检查存储在树中的子模块版本,除非已经检出的子模块具有冲突的修改,在这种情况下它将中止。
您可以将其添加为post-checkout
挂钩以自动执行此操作。
如果您喜欢危险地生活,可以在结账前使用以下内容重置子模块,以避免在签出新版本时发生冲突。
git submodule foreach git reset --hard HEAD
git submodule foreach git clean -f
当然,这会消除您子模块中的任何更改,因此请谨慎使用。
答案 1 :(得分:1)
git submodule
命令是作为shell脚本实现的,尽管它确实从git submodule--helper
请求了一些帮助。手头问题的relevant line就是:
git diff-files --ignore-submodules=dirty --quiet -- "$sm_path"
这将匹配的提交(git submodule status
中的空间)与不同的提交(状态为+
)区分开来。还有其他代码片段可用于detect U
conflicts(使用help of git submodule--helper
)或-
uninitialized submodules。
在我的实验中,冲突的情况(即父repo中的合并对于用于子模块的提交具有冲突的输入)导致diff-files
命令的非零退出状态。但是,没有报告未初始化的存储库。因此,我建议使用以下命令检查子模块是否是最新的:
test -f "$sm_path/.git" -o -d "$sm_path/.git" && \
git diff-files --ignore-submodules=dirty --quiet -- "$sm_path"