git中可读的子模块状态信息

git中可读的子模块状态信息,git,git-submodules,Git,Git Submodules,我有一个脚本,可以签出repo,签出子模块,然后打印一些关于子模块的信息,这样用户就知道他们正在处理哪些标记/分支 我自己的工作站上的输出如下所示: Entering 'SubModuleA', * feature/some_feature_branch, Branch is, feature/some_feature_branch, Tag is, undefined, En

我有一个脚本,可以签出repo,签出子模块,然后打印一些关于子模块的信息,这样用户就知道他们正在处理哪些标记/分支

我自己的工作站上的输出如下所示:

        Entering 'SubModuleA', 
        * feature/some_feature_branch,
        Branch is, 
        feature/some_feature_branch,
        Tag is, 
        undefined, 
        Entering 'SubModuleB'
        * (detached from 1.1.9)
        Branch is
        HEAD
        Tag is
        1.1.9^0
 git submodule foreach 'git branch | grep \* ; echo Branch is && git rev-parse --abbrev-ref HEAD ;  echo Tag is && git name-rev --tags --name-only $(git rev-parse HEAD) '
在本例中,主repo指向子模块a的特征分支和子模块B的标记

但当我使用ansible在其他工作站或虚拟机上运行此代码时,输出看起来不同:

        Entering 'SubModuleA', 
        * (detached from 1234abcd), 
        Branch is, 
        HEAD, 
        Tag is, 
        undefined, 
        Entering 'SubModuleB'
        * (detached from a1b23c4d)
        Branch is
        HEAD
        Tag is
        1.1.9^0
代码如下所示:

        Entering 'SubModuleA', 
        * feature/some_feature_branch,
        Branch is, 
        feature/some_feature_branch,
        Tag is, 
        undefined, 
        Entering 'SubModuleB'
        * (detached from 1.1.9)
        Branch is
        HEAD
        Tag is
        1.1.9^0
 git submodule foreach 'git branch | grep \* ; echo Branch is && git rev-parse --abbrev-ref HEAD ;  echo Tag is && git name-rev --tags --name-only $(git rev-parse HEAD) '
这有点像霍奇·波奇(hodge podge)的其他例子,我发现这些例子可以得到这样的信息,但我很难找到一致的东西

playbook中紧靠状态检查之前的命令为

git submodule init
git submodule update

我不知道为什么我会得到不同的结果。是否有任何能可靠地打印子模块的分支名称和标签名的一致性?

< P>我认为您的困惑源在于Git相对于子模块的状态存储的唯一信息是提交ID。考虑现有的具有多个分支的存储库,例如,这一个:

克隆它:

$ git https://github.com/githubtraining/hellogitworld.git
$ cd hellogitworld
现在,获取命名分支的提交ID(比如“master”):

现在,检查提交ID:

$ git checkout ef7bebf8bdb1919d947afe46ab4b2fb4278039b3
然后运行
git status

$ git status
HEAD detached at ef7bebf
nothing to commit, working directory clean
如您所见,即使您签出了一个提交ID 对应于一个命名分支,
git
不知道(因为您 直接定位提交id,而不是通过 姓名)

如果克隆一个包含 子模块。子模块是通过提交id而不是通过 任何指定的分支。这实际上是一个关键特性:它确保 即使分支在 链接存储库

您可以使用
git descripe
命令获取 本例中的分支。例如:

$ git describe --all
heads/master
需要使用
--all
标志才能将
git description
获取到
考虑分支名称和标签。

还要记住,如果在创建新分支之前存在,则提交可以在多个分支上。因此,您无法真正思考父项目指向哪个分支。它指向一个提交,可能在几个分支上。很好!这几乎适用于所有情况!还有两个子模块可以打印类似于
heads/develope-5-a244b796
,其他的都是
tags/SomeTag
remotes/origin/feature/someteffeature