在git存储库中列出子模块

我有一个git仓库中有几个子模块。 如何在git submodule init运行后列出所有子模块的名称?

git submodule foreach命令可以回显子模块的名字,但是只有在init步骤之后没有发生的情况下才能使用。 链中有更多的步骤需要在可以检出之前进行,而且我不想将子模块的名称硬连线到脚本中。

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

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

例如,从回购的根, cat .gitmodules将打印内容到屏幕(假设你有cat )。

编辑:

由于.gitmodule文件具有gitconfiguration格式,因此可以使用git config来parsing这些文件:

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

会告诉你所有的子模块条目,并与

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

你只会得到子模块path本身。

只返回已注册子模块的名称,您可以使用此命令。

 grep path .gitmodules | sed 's/.*= //' 

把它看作是不存在的git子模块–list

你可以使用git submodule status或者可选的git submodule status --recursive如果你想显示嵌套的子模块的话,可以使用git submodule status --recursive

从GIT SCM文档:

显示子模块的状态。 这将为每个子模块打印当前签出提交的SHA-1,以及为SHA-1描述的子模块path和git输出。 如果子模块未初始化,则每个SHA-1都将加前缀+,如果当前检出的子模块提交与包含存储库的索引中find的SHA-1不匹配,则为U,如果子模块存在合并冲突。

以下命令将列出子模块:

 git submodule--helper list 

输出是这样的:

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

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

我使用这个:

 git config --list|egrep ^submodule 

我注意到在这个问题的答案中提供的命令给了我正在寻找的信息:

.gitmodule中找不到子模块的path的子模块映射

 git ls-files --stage | grep 160000 

我可以看到答案已经被选中,但对于任何其他人来说,这个页面:

 $ git submodule 

将列出指定的git仓库中的所有子模块。

干杯

您可以使用:

 git submodule | awk '{ print $2 }' 

我使用这个:

 git submodule status | cut -d' ' -f3-4 

输出(path+版本):

 tools/deploy_utils (0.2.4) 

只是 子模块的path ,女士…

 git config --list | grep \^submodule | cut -f 2 -d . 
 Vendor/BaseModel Vendor/ObjectMatcher Vendor/OrderedDictionary Vendor/_ObjC Vendor/XCodeHelpers 

👍🏼

git config允许指定一个configuration文件。
.gitmodules 一个configuration文件。

所以,借助“ 以空格作为分割命令 ”的帮助:

 git config --file=.gitmodules --get-regexp ^^submodule.*\.path$ | cut -d " " -f 2 

这将只列出path,每个声明的子模块。

这对我工作:

 git ls-files --stage | grep $160000 

基于这个伟大的文章: http : //www.speirs.org/blog/2009/5/11/understanding-git-submodules.html

如果你不介意只在初始化的子模块上运行,你可以使用git submodule foreach来避免文本parsing。

 git submodule foreach --quiet 'echo $name'