我有一个Git存储库,其中有几个子模块。如何在git子模块init运行后列出所有子模块的名称?
git子模块foreach命令可以回显子模块的名称,但这只有在它们被签出后才有效,而在init步骤之后没有发生。在签出之前,链中还有更多的步骤需要执行,我不希望将子模块的名称硬连接到脚本中。
那么是否存在一个Git命令来获取所有当前已注册但尚未签出的子模块的名称?
我有一个Git存储库,其中有几个子模块。如何在git子模块init运行后列出所有子模块的名称?
git子模块foreach命令可以回显子模块的名称,但这只有在它们被签出后才有效,而在init步骤之后没有发生。在签出之前,链中还有更多的步骤需要执行,我不希望将子模块的名称硬连接到脚本中。
那么是否存在一个Git命令来获取所有当前已注册但尚未签出的子模块的名称?
当前回答
使用内置git函数显示每个子模块的所有信息:
git submodule foreach -q git config -l
或者只是url:
git submodule foreach -q git config remote.origin.url
从这里偷来的。
其他回答
Git配置允许指定配置文件。 gitmodules是一个配置文件。
因此,在“使用空格作为cut命令的分隔符”的帮助下:
git config --file=.gitmodules --get-regexp ^^submodule.*\.path$ | cut -d " " -f 2
它将只列出路径,每个声明的子模块一个路径。
Tino在评论中指出:
这对于包含空格的子模块无效。 子模块路径可能包含换行符,如 Git子模块添加https://github.com/hilbix/bashy.git“子模块” Git mv 'sub module' $'sub\nmodule'
作为一个更强大的替代方案,Tino提出:
Git config -z——file . Git modules——get-regexp ` \。路径$' | \ Sed -nz 's/^[^\n]*\n//p' | \ Tr '\0' '\n' 对于有换行符的路径(可以用git mv创建),去掉| tr '\0' '\n',使用类似于…| while IFS= " read -d " path;做……用于使用bash进行进一步处理。 这需要一个现代bash,它能理解read -d "(不要忘记-d和"之间的空格)。
我用这个:
git config --list|egrep ^submodule
只是一个简单的子模块列表:
git submodule--helper list | cut -d$'\t' -f 2
你可以使用:
git submodule | awk '{ print $2 }'
按名称列出所有子模块:
Git子模块——quiet foreach——递归echo $name