如何可靠地确定git子模块的当前分支名称

fsteff

背景:作为构建脚本的一部分,我们验证项目的所有部分都在适当的分支上,并且被正确标记。

我们一直在使用git submodule foreach --recursive "git branch -r"以确定分支名称的方法,但是随着时间的流逝,错误报告的分支名称数量越来越多。

我目前有一个项目,其中三个子模块中的两个始终在错误/无效分支上报告。:-(

这三个子模块最近都已更新,贯穿整个工作流程,并且现在都已掌握。主存储库已更新了其子模块,并已在工作流的所有阶段进行了测试。

在构建期间,可以获取正确的源(如果已获取)和git标签(如果已设置)。但是,对于某些子模块,返回的分支名称错误或无效。:-(

后台更新:部分修复;事实证明,无效的分支名称是由于缺少分支历史记录所致,而这又归因于Jenkins Git插件高级子模块设置中的“ stuck”值,从而总是在子模块上执行浅表克隆。更新插件解决了问题的这一部分,因此现在总是返回分支,而并非总是期望的分支。注意:下面问题中的任何内容都没有更新以反映这一点。)

工作流程:

  • 功能->开发->大师

版本:

  • 最初使用git 2.18.0.windows.1版进行了测试
  • 然后升级到git版本2.23.0.windows.1
  • 服务器站点正在BitBucket上运行,并且当前未知版本的git。

Sofar我尝试了以下操作:

确保检出了正确的哈希值:(哈希值正确!)

>git submodule foreach --recursive "echo $name $sha1"
Entering 'submodules/basic'
submodules/basic ab7ce14cfaca960381f7c83bc1e6489c04863ce3
Entering 'submodules/codecs'
submodules/codecs f1329f063970448c5e06aa484df30d8d89683adc
Entering 'submodules/scripts'
submodules/scripts e0c2ceb9b792b45af46a91e3687acafeb0689316

验证日志:

>git submodule foreach --recursive "git log --oneline" (Hashes and Merge message are correct)
Entering 'submodules/basic'
ab7ce14 Merge pull request #53 in REF/basic from develop to master
Entering 'submodules/codecs'
f1329f0 Merge pull request #71 in PROT/codecs from develop to master
Entering 'submodules/scripts'
e0c2ceb Merge pull request #15 in CI/scripts from develop to master

用于确定分支名称的原始方法。(分支名称应为主名称)

>git submodule foreach --recursive "git branch -r"
Entering 'submodules/basic'
  origin/HEAD -> origin/develop
  origin/develop
Entering 'submodules/codecs'
  origin/HEAD -> origin/develop
  origin/develop
Entering 'submodules/scripts'
  origin/HEAD -> origin/master
  origin/master

检查远程服务器上是否有合并的哈希:(不返回任何受影响的存储库)

>git submodule foreach --recursive "git branch -r --merged $sha1"
Entering 'submodules/basic'
Entering 'submodules/codecs'
Entering 'submodules/scripts'
  origin/HEAD -> origin/master
  origin/master

请求哈希的名称修订(--name-name使得易于解析的输出):(分支名称似乎未定义!!!)

>git submodule foreach --recursive "git name-rev $sha1"
Entering 'submodules/basic'
ab7ce14cfaca960381f7c83bc1e6489c04863ce3 undefined
Entering 'submodules/codecs'
f1329f063970448c5e06aa484df30d8d89683adc undefined
Entering 'submodules/scripts'
e0c2ceb9b792b45af46a91e3687acafeb0689316 master

尝试读取人类可读的对象描述符:(返回截断的哈希,而不是分支名称)

>git submodule foreach --recursive "git describe --always --all"
Entering 'submodules/basic'
ab7ce14
Entering 'submodules/codecs'
f1329f0
Entering 'submodules/scripts'
heads/master

搜索哈希:(不返回任何受影响的存储库)

>git submodule foreach --recursive "git branch --contains $sha1"
Entering 'submodules/basic'
* (HEAD detached at ab7ce14)
Entering 'submodules/codecs'
* (HEAD detached at f1329f0)
Entering 'submodules/scripts'
* (HEAD detached at e0c2ceb)
  master

在远程上搜索哈希:(不为受影响的存储库返回任何内容。)

>git submodule foreach --recursive "git branch -r --contains $sha1"
Entering 'submodules/basic'
* (HEAD detached at ab7ce14)
Entering 'submodules/codecs'
* (HEAD detached at f1329f0)
Entering 'submodules/scripts'
* (HEAD detached at e0c2ceb)
  origin/HEAD -> origin/master
  origin/master

正如@torek所建议的那样,我还测试了以下命令:(两者都没有为受影响的子模块提供任何新功能)

>git submodule foreach --recursive "git for-each-ref --contains=HEAD"
Entering 'Submodules/basic'
Entering 'Submodules/codec'
Entering 'Submodules/scripts'
e0c2ceb9b792b45af46a91e3687acafeb0689316 commit refs/heads/master
e0c2ceb9b792b45af46a91e3687acafeb0689316 commit refs/remotes/origin/HEAD
e0c2ceb9b792b45af46a91e3687acafeb0689316 commit refs/remotes/origin/master

>git submodule foreach --recursive "git for-each-ref --contains=$sha1"
Entering 'Submodules/basic'
Entering 'Submodules/codec'
Entering 'Submodules/scripts'
e0c2ceb9b792b45af46a91e3687acafeb0689316 commit refs/heads/master
e0c2ceb9b792b45af46a91e3687acafeb0689316 commit refs/remotes/origin/HEAD
e0c2ceb9b792b45af46a91e3687acafeb0689316 commit refs/remotes/origin/master

我真的很难理解输出。哈希值当然与合并到母版相关联,但是各种命令要么不返回任何内容,未知,不正确的分支(此处为develop)或被截断(但正确)的哈希。

对于所有这些,应该注意,BitBucket GUI可以正确显示所有内容,我只是希望能够使用CLI命令执行相同的操作。

我如何从这里开始?

如何确保获得可靠和正确的结果?

fsteff

在发现Jenkins Git插件正在跟我玩耍时,只剩下分支名称错误的问题。事实证明这是git的动态特性,并且是对命令git branch -r实际工作方式的误解

git分支文档指出:
git branch默认操作是--show-current
--show-current,打印当前分支的名称。在分离的HEAD状态下,不打印任何内容。
-r列出或删除(如果与-d一起使用)远程跟踪分支。

上面提到当前分支不是本地已签出的当前分支,而是签出的分支的远程当前HEAD。因此,在分支时间之后发生的所有开发都包含在输出中,例如:

>git submodule foreach --recursive "git branch -r"
Entering 'Submodules/basic'
  origin/HEAD -> origin/develop
  origin/bugfix/something1_after_the merge
  origin/develop
  origin/feature/something2_after_the merge
  origin/feature/something3_after_the merge
  origin/master
Entering 'Submodules/codec'
  origin/HEAD -> origin/develop
  origin/develop
  origin/feature/something4_after_the merge
  origin/master
Entering 'scripts'
  origin/HEAD -> origin/master
  origin/feature/something5_after_the merge
  origin/develop
  origin/master

为了确保我们仅直接获得输出,包括out local分支的版本,我们需要添加--contains选项,提供sha1。此外,通过使用排序反向提交日期,--sort=-committerdate我们进一步确保用于提交的确切分支名称将在输出中排在首位:

>git submodule foreach --recursive "git branch -r --sort=-committerdate --contains $sha1"
Entering 'Submodules/basic'
  origin/master
Entering 'Submodules/codec'
  origin/master
Entering 'Submodules/scripts'
  origin/master
  origin/HEAD -> origin/master

这样,我得到了期望的输出。

奖金:

要仅获取已检出哈希的分支名称,仅此而已,可以使用以下内容。它仅在第一行上操作,并去除origin/分支名称之前(包括分支名称)的所有内容:

>git submodule foreach --recursive "git branch -r --sort=-committerdate --contains $sha1 | while read line ; do line=${line#*> }; line=${line/#origin\/}; echo line; break; done;"
Entering 'Submodules/basic'
  master
Entering 'Submodules/codec'
  master
Entering 'Submodules/scripts'
  master

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Git子模块状态-如何显示子模块中的当前分支

如何仅访问git子模块的分支名称?

git:子模块跟踪当前分支

如何可靠地确定C#中字符的宽度?

如何可靠地确定存折是否可用?

如何可靠地确定用户的呼叫或短信功能

如何可靠地确定句柄是否是Haskell中的终端?

如何从git钩可靠地找到根git目录?

如何从特定分支更新git子模块?

如何读取git分支的当前上游

如何确定重写后挂钩中的当前分支

无论当前窗口如何,如何使用“ Space”热键可靠地暂停PotPlayer?

如果不能选择FileMagic,如何可靠地确定文件类型?

如何可靠地确定最近7天未使用的所有文件夹?

如何可靠地确定远程存储库中的最后提交日期?

如何获得可调用对象的签名参数,或者可靠地确定何时无法实现?

无法可靠地确定服务器的标准域名...如何在Docker中解决?

如何可靠地测试/确定.Net HashSet <T>对象的大小(包括空存储桶)?

如何可靠地确定UICollectionView布局何时完成动画制作

如何可靠地确定文件是否为图像文件?

如何在Linux下可靠地确定文件系统类型?

我如何确定 mysql 语句在 wordpress 中可靠地完成

如何使SKAction(name :)可靠地工作?

Git子模块开发分支

无法可靠地确定服务器的标准域名

无法可靠地确定服务器的标准域名

无法可靠地确定服务器的标准域名

在R中,如何从自定义打印功能可靠地打印对象的名称?

如何可靠地引用X中名称与另一个变量相同的列