正在更新Jenkins作业中的子模块repo



我需要做的是:

有一个git存储库,它被用作少数其他存储库的子模块。每个主存储库都包含对子模块存储库中不同分支的引用。(实际上大多数指的是同一分支,少数指的是不同分支)。我想做的是,有一个Jenkins作业克隆父repo,更新子模块(所以我将有对应于父repo的子模块的相关修订),在那里做一些工作,更新子模块中的version.txt文件并把它推回git。

我的问题是,子模块修订被检出为DETACHED HEAD。虽然这个问题可以在使用Checkout to local branch选项的常规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

。这样,每次提交都在RS中存储要检出的正确哈希ID。超级项目R不能存储分支名称,因为分支名称移动,我们需要一个固定的提交。理论上,它可以存储标签名,因为理论上标签名是不会移动的;但它并不是这样实施的。因此,我们被所做的实现所困扰-并且在任何情况下,对标签名称执行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 
"""

最新更新