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

FormsDesigner感到沮丧

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

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

        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。考虑一个具有多个分支的现有存储库,例如:

克隆它:

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

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

$ git rev-parse master
ef7bebf8bdb1919d947afe46ab4b2fb4278039b3

现在,检查该提交ID:

$ git checkout ef7bebf8bdb1919d947afe46ab4b2fb4278039b3

并运行git status

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

如您所见,即使您签出了与命名分支相对应的提交ID,git也不知道这一点(因为您直接找到了提交ID,而不是通过名称进行查找)。

如果克隆包含子模块的存储库,这正是发生的情况。子模块是通过commit id检出的,而不是通过任何命名分支检出的这实际上是一个关键功能:即使分支在链接存储库中前进,它也可以确保始终获得相同的提交。

git describe在这种情况下,可以使用命令获取分支的名称。例如:

$ git describe --all
heads/master

--all标志是必需的,以便git describe考虑分支名称和标记。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章