如何解决更新 Jenkins 作业中的子模块存储库
我需要做的如下:
有一个 git 存储库,它在其他几个存储库中用作子模块。每个主存储库都包含对子模块存储库中不同分支的引用。 (实际上他们中的大多数指的是同一个分支,很少有其他分支指的是不同的分支)。 我想要做的是,有一个 Jenkins 工作来克隆父仓库,更新子模块(所以我会有与父仓库对应的子模块的相关修订版),在那里做一些工作,更新一个 {{ 1}} 文件在子模块中并将其推送回git。
我的问题是,子模块修订版被检出为 DETACHED HEAD。
虽然这个问题可以在使用 version.txt
选项的常规 checkout
中解决,但它似乎不适用于子模块。
有什么建议吗??
解决方法
所有 子模块都使用 detached-HEAD 模式。这就是子模块的工作方式。
请记住,Git 子模块是一个 Git 存储库。所以它在克隆时只是一个普通的存储库:提交的集合,通过它们的元数据连接在一起形成历史,分支和标签名称选择特别有趣的提交,从中我们可以找到所有其他提交。
使子模块成为子模块,而不仅仅是“存储库”的原因在于在之后它被克隆——通常是由超级项目,也就是控制 Git 存储库在子模块的“上方”——超级项目 Git 在子模块存储库中选择一个特定的提交。
如果我们调用超级项目 R 和子模块 S(以便我们可以区分它们),我们所做的是:
mkdir -p path/to/project && cd path/to/project
git clone $superproject R
git clone --no-checkout $submodule R/S
chosen_commit=$(cd R; git command-to-tell-me-which-hash-ID S)
(cd R/S && git checkout --detach $chosen_commit)
我们并不是真的运行 Git 命令来向我们显示正确的哈希 ID——尽管有一个;它只是git rev-parse
,例如,(cd R; git rev-parse HEAD:S)
可以解决问题——但这就是我们执行运行的命令的效果:
mkdir R && cd R && git clone $superproject && git submodule update --init
对于每个子模块,git submodule update --init
命令将:
- 克隆子模块,使用
--no-checkout
,从.gitmodules
获取 URL; - 通过执行适当的
git rev-parse
找出要检查的提交;和 - 检查该特定提交,作为分离的 HEAD,在相应子模块的工作树中。
以这种方式,R 中的每个提交都会存储正确的哈希 ID,以便在 S 中检出。超级项目R 不能存储分支名称,因为分支名称move,我们需要一个固定的提交。理论上,它可以存储标签名称,因为理论上标签名称不会移动;但这不是它的实施方式。因此,我们一直坚持做了什么实现——无论如何,对标签名称执行 git checkout
也会导致分离的 HEAD。
请注意,在 Git 中,哈希 ID 是提交的名称。分支或标签名称只是一个人类可读的别名——好吧,我们可以希望一个对人类有意义的别名。不过,真正重要的是哈希 ID。并且,在子模块中,正确哈希 ID 的来源是超级项目的提交——它只存储原始哈希 ID。这就是我们所拥有的,所以这就是你所能得到的。
,我使用以下 Powershell 脚本解决了这个问题:
// Get-SubmoduleBranch
param(
[parameter(mandatory)]
[string]$SubmoduleName,[parameter(mandatory)]
[string]$GitmodulesFile
)
$IsCorrectSubmodule = $False
$Found = $False
Switch -Regex -File $GitmodulesFile {
"Submodule .*$($SubmoduleName)" { $IsCorrectSubmodule = $True }
"branch" {
if($IsCorrectSubmodule) {
$Found = $True
$Pair = $_ -split "="
$Pair[1].Trim() # Output the branch name
break
}
}
}
if($Found -eq $False) {
Write-Error “Didn’t find submodule branch”
}
在 Jenkinsfile 中
powershell script: """
\$Branch = Get-SubmoduleBranch -SubmoduleName <someSubmodule> -GitmodulesFile .gitmodules
git checkout \$Branch
git add
git commit
git push
"""
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。