我有一个Git存储库,其中有几个子模块。如何在git子模块init运行后列出所有子模块的名称?

git子模块foreach命令可以回显子模块的名称,但这只有在它们被签出后才有效,而在init步骤之后没有发生。在签出之前,链中还有更多的步骤需要执行,我不希望将子模块的名称硬连接到脚本中。

那么是否存在一个Git命令来获取所有当前已注册但尚未签出的子模块的名称?


当前回答

我注意到在回答这个问题时提供的命令为我提供了我正在寻找的信息:

在.gitmodule中找不到非子模块路径的子模块映射

git ls-files --stage | grep 160000

其他回答

Use:

$ git submodule

它将列出指定Git存储库中的所有子模块。

你可以使用与git子模块init使用自身相同的机制,即查看.gitmodules。该文件枚举每个子模块路径及其引用的URL。

例如,从存储库的根目录,cat .gitmodules将把内容打印到屏幕上(假设你有cat)。

因为.gitmodule文件有Git配置格式,你可以使用Git配置来解析这些文件:

git config --file .gitmodules --name-only --get-regexp path

将显示所有子模块条目,并与

git config --file .gitmodules --get-regexp path | awk '{ print $2 }'

您只能得到子模块路径本身。

如果你不介意只对初始化的子模块进行操作,你可以使用git子模块foreach来避免文本解析。

git submodule foreach --quiet 'echo $name'

下面的命令将列出子模块:

git submodule--helper list

输出如下所示:

<mode> <sha1> <stage> <location>

注意:需要Git 2.7.0或以上版本。

假设你目前已经注册了,但还没有签出子模块,如下:

$ cat .gitmodules
[submodule ".github/workflows/packages"]
        path = .github/workflows/packages
        url = https://github.com/MarketLeader/Packages
[submodule ".github/workflows/builders"]
        path = .github/workflows/builders
        url = https://github.com/chetabahana/runner
[submodule "docs"]
        path = docs
        url = https://github.com/eq19/lexer

下面是Git命令来获取存储库的根目录:

$ git submodule foreach -q '[[ "$sm_path" == */* ]] || git config remote.origin.url'
https://github.com/eq19/lexer

下面是Git命令在特定路径上获取列表:

$ git submodule foreach -q '[[ ! "$sm_path" == .github/* ]] || git config remote.origin.url'
https://github.com/chetabahana/runner
https://github.com/MarketLeader/Packages

当然,你也可以用其他命令修改git config remote.origin.url。

顺便说一下,我使用的是git 2.38.1版