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

我有一个脚本,检查一个仓库,检查子模块,然后打印一些有关子模块的信息,以便用户知道他们正在处理哪些标签/分支.

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

        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

在此示例中,主仓库指向子模块A的特征分支和子模块B的标记.

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

        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

代码如下所示:

 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) '

这是我发现获得这种信息的其他例子的一点点大杂烩,但我找不到一致的东西.

紧接在剧本中的状态检查之前的命令是

git submodule init
git submodule update

我不确定为什么我会得到不同的结果.有什么能够可靠地打印子模块的分支名称和标签名称吗?

最佳答案 我认为你的困惑的根源是,关于子模块状态的唯一信息git是提交ID.考虑一个具有多个分支的现有存储库,比如说这个:

> https://github.com/githubtraining/hellogitworld.git

克隆它:

$git https://github.com/githubtraining/hellogitworld.git
$cd hellogitworld

现在,获取命名分支的提交ID(例如,’master’):

$git rev-parse master
ef7bebf8bdb1919d947afe46ab4b2fb4278039b3

现在,查看提交ID:

$git checkout ef7bebf8bdb1919d947afe46ab4b2fb4278039b3

并运行git状态:

$git status
HEAD detached at ef7bebf
nothing to commit, working directory clean

如您所见,即使您已签出了提交ID
对应一个命名分支,git不知道(因为你
直接找到提交ID,而不是通过查找
名称).

这正是克隆包含的存储库时会发生的情况
子模块.子模块由提交ID检出,而不是由
任何命名分支.这实际上是一个关键特征:它确保
你总是得到相同的提交,即使分支进展
链接存储库.

您可以使用git describe命令获取该名称
在这种情况下分支.例如:

$git describe --all
heads/master

为获取git描述,需要–all标志
考虑分支名称和标签.

点赞