You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让GitVersion基于dev分支而非main分支进行版本递增?

问题描述

我们在feature/*分支开发功能,通过Azure DevOps的拉取请求(Pull Request)将其合并到dev分支。拉取请求模板提供修复(Fix)、新功能(Feature)、**重大变更(Major Change)**三个选项,选择后构建验证流水线会生成+semver: (major|minor|patch)格式的提交,触发GitVersion进行版本递增。

当前存在问题:每次将feature/*合并到dev分支时,版本是基于main分支的最新版本进行递增,需要调整为基于dev分支的最新版本递增。


拉取请求模板

## 更新类型 
    - [ ] 修复(Fix)
    - [ ] 新功能(Feature)
    - [ ] 重大变更(Major Change)

构建验证流水线

trigger:
- none

pool:
  vmImage: ubuntu-latest

## 计算语义化版本的任务
jobs:
  - job: CalculateVersion
    displayName: 语义化版本计算

    steps:
      # 带持久化凭证的代码检出
      - checkout: self
        fetchDepth: 0
        persistCredentials: true

      # 安装GitVersion
      - task: gitversion/setup@0
        displayName: 安装GitVersion
        inputs:
          versionSpec: '5.x'

      # 获取拉取请求描述
      - task: PullRequestDescription@0
        name: RetrievePullRequestDescription
        displayName: 获取拉取请求描述
        inputs:
          action: 'view'
          outputVariable: 'PullRequest.DescriptionContent'
          isOutput: true
          stripIdentifiers: false

      # 添加会被GitVersion识别的Git提交消息(格式为"+semver: patch/minor/major")
      # 根据开发者在拉取请求描述中选择的变更类型执行
      - task: PowerShell@2
        displayName: 添加SemVer用的Git提交消息
        inputs:
          targetType: inline
          script: |
            Write-Host "配置Git作者信息.." -ForegroundColor Cyan
            git config user.email "Azure DevOps pipeline"
            git config user.name "Azure.Devops@pipeline.com"
            Write-Host "执行Git checkout操作..." -ForegroundColor Cyan
            git checkout -b "$(System.PullRequest.SourceBranch)".replace('refs/heads/', '')
            Write-Host "检查拉取请求描述..." -ForegroundColor Cyan
            $PRdesc = "$(RetrievePullRequestDescription.PullRequest.DescriptionContent)"
            if ($PRdesc -match '(\[x\] \b修复(Fix)\b)') {
              Write-Host "添加Git空提交消息,标记此分支为SemVer的'patch'版本递增。" -ForegroundColor Cyan
              git commit -a -m "+semver: patch [skip azurepipelines]" --allow-empty
            } elseif ($PRdesc -match '(\[x\] \b新功能(Feature)\b)') {
              Write-Host "添加Git空提交消息,标记此分支为SemVer的'minor'版本递增。" -ForegroundColor Cyan
              git commit -a -m "+semver: minor [skip azurepipelines]" --allow-empty
            } elseif ($PRdesc -match '(\[x\] \b重大变更(Major Change)\b)') {
              Write-Host "添加Git空提交消息,标记此分支为SemVer的'major'版本递增。" -ForegroundColor Cyan
              git commit -a -m "+semver: major [skip azurepipelines]" --allow-empty
            } else {
              Write-Host "##vso[task.LogIssue type=error;]请在拉取请求描述中选择变更类型,然后重新触发验证流水线。" -ForegroundColor Cyan
              $PRdesc
              exit 1
            }
            Write-Host "执行Git push操作.." -ForegroundColor Cyan
            git push -f --set-upstream origin "$(System.PullRequest.SourceBranch)".replace('refs/heads/', '')
            Write-Host "完成。" -ForegroundColor Cyan

      # 确定语义化版本
      - task: gitversion/execute@0
        displayName: 确定SemVer版本
        inputs:
          useConfigFile: True
          configFilePath: ".azuredevops/gitversion.yml"
          updateAssemblyInfo: true

GitVersion.yml配置文件

next-version: 1.0
assembly-versioning-scheme: MajorMinorPatch
assembly-file-versioning-scheme: MajorMinorPatchTag
assembly-informational-format: '{InformationalVersion}'
mode: ContinuousDeployment
increment: Inherit
continuous-delivery-fallback-tag: ci
tag-prefix: '[vV]'
major-version-bump-message: '\+semver:\s?(breaking|major)'
minor-version-bump-message: '\+semver:\s?(feature|minor)'
patch-version-bump-message: '\+semver:\s?(fix|patch)'
no-bump-message: '\+semver:\s?(none|skip)'
legacy-semver-padding: 4
build-metadata-padding: 4
commits-since-version-source-padding: 4
commit-message-incrementing: Enabled
commit-date-format: 'yyyy-MM-dd'
# ignore:
#   sha: []
#   commits-before: yyyy-MM-ddTHH:mm:ss
merge-message-formats: {}
branches:
  main:
    regex: ^main$
    mode: ContinuousDelivery
    tag: ''
    increment: Patch
    prevent-increment-of-merged-branch-version: true
    track-merge-target: false
    tracks-release-branches: false
    is-release-branch: false
  feature:
    regex: ^feature?[/-]
    mode: ContinuousDeployment
    tag: useBranchName
    increment: Inherit
    prevent-increment-of-merged-branch-version: false
    track-merge-target: false
    tracks-release-branches: true
    is-release-branch: false
  hotfix:
    regex: ^hotfix(es)?[/-]|^bugfix(es)?[/-]|^fix?[/-]
    mode: ContinuousDelivery
    tag: patch
    increment: Patch
    prevent-increment-of-merged-branch-version: false
    track-merge-target: false
    tracks-release-branches: false
    is-release-branch: false
  develop:
    regex: ^dev$
    mode: ContinuousDeployment
    prevent-increment-of-merged-branch-version: false
    track-merge-target: false
    tracks-release-branches: false
    is-release-branch: true
    pre-release-weight: 1000

预期流程

预期版本递增流程

当前实际流程

当前版本递增流程


解决方案

要让GitVersion基于dev分支的最新版本递增,需调整GitVersion.yml的分支配置:

  1. 修改分支跟踪配置
    将feature和dev分支的track-merge-target属性设置为true,让GitVersion在计算版本时,以dev分支作为feature分支的合并基准。

修改后的分支配置片段:

branches:
  main:
    regex: ^main$
    mode: ContinuousDelivery
    tag: ''
    increment: Patch
    prevent-increment-of-merged-branch-version: true
    track-merge-target: false
    tracks-release-branches: false
    is-release-branch: false
  feature:
    regex: ^feature?[/-]
    mode: ContinuousDeployment
    tag: useBranchName
    increment: Inherit
    prevent-increment-of-merged-branch-version: false
    track-merge-target: true  # 改为true
    tracks-release-branches: true
    is-release-branch: false
  hotfix:
    regex: ^hotfix(es)?[/-]|^bugfix(es)?[/-]|^fix?[/-]
    mode: ContinuousDelivery
    tag: patch
    increment: Patch
    prevent-increment-of-merged-branch-version: false
    track-merge-target: false
    tracks-release-branches: false
    is-release-branch: false
  develop:
    regex: ^dev$
    mode: ContinuousDeployment
    prevent-increment-of-merged-branch-version: false
    track-merge-target: true  # 改为true
    tracks-release-branches: false
    is-release-branch: true
    pre-release-weight: 1000
  1. 确保流水线拉取最新dev分支代码
    在流水线的PowerShell步骤开头添加拉取操作,确保本地仓库包含dev分支的最新提交:
Write-Host "拉取dev分支最新代码..." -ForegroundColor Cyan
git fetch origin dev

调整后,合并feature/*到dev时,GitVersion会以dev分支的最新版本为基准,根据PR选择的变更类型进行版本递增。


内容的提问来源于stack exchange,提问作者13bloc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:34:55