相关文章推荐
精明的开心果  ·  mysql sql error ...·  2 年前    · 
干练的羽毛球  ·  Django 小实例S1 ...·  2 年前    · 
绅士的匕首  ·  sh - Why: syntax ...·  2 年前    · 

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019 | TFS 2018

分支策略可帮助团队保护其重要的 开发分支 。 这些策略强制实施团队的代码质量和更改管理标准。 本文介绍如何设置和管理分支策略。 有关所有存储库以及分支策略和设置的概述,请参阅 Git 存储库设置和策略

无法删除配置了所需策略的分支,并且所有更改都需要拉取请求 (PR)。

  • 若要设置分支策略,你需要是“项目管理员”安全组的成员,或者具有存储库级别的“编辑策略”权限。 有关详细信息,请参阅 设置 Git 存储库权限

  • 如果要使用 Azure DevOps CLI az repos policy 命令来管理分支策略,请按照 Azure DevOps CLI 入门 中的步骤操作。

    若要列出项目中的所有策略,请使用 az repos policy list

    az repos policy list [--branch]
                         [--detect {false, true}]
                         [--org]
                         [--project]
                         [--query-examples]
                         [--repository-id]
                         [--subscription]
    org, organization
    Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或未通过 git 配置选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/project, p
    项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。
    query-examples
    建议的 JMESPath 字符串。 可以复制其中一个查询,并将其粘贴到 --query 参数后,置于双引号中,以查看结果。 可以添加一个或多个位置关键字,以便根据这些关键字提供建议。
    repository-id
    要按完全匹配筛选结果的存储库的 ID。 例如,--repository-ID e556f204-53c9-4153-9cd9-ef41a11e3345subscription
    订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
    

    以下命令返回在 ID 为 d28cd374-e7f0-4b1f-ad60-f349f155d47c 的 Fabrikam 存储库的 main 分支中生效的所有分支策略。 可以通过运行 az repos list 来获取存储库 ID。

    此示例使用以下默认配置:az devops configure --defaults organization=https://dev.azure.com/fabrikamprime project="Fabrikam Fiber"

    az repos policy list --repository-id d28cd374-e7f0-4b1f-ad60-f349f155d47c --branch main --output table
    ID    Name                         Is Blocking    Is Enabled    Repository Id                         Branch
    ----  ---------------------------  -------------  ------------  ------------------------------------  ---------------
    3     Work item linking            False          True          d28cd374-e7f0-4b1f-ad60-f349f155d47c  refs/heads/main
    5     Minimum number of reviewers  True           True          d28cd374-e7f0-4b1f-ad60-f349f155d47c  refs/heads/main
    6     Comment requirements         False          True          d28cd374-e7f0-4b1f-ad60-f349f155d47c  refs/heads/main
    12    Required reviewers           True           False         d28cd374-e7f0-4b1f-ad60-f349f155d47c  refs/heads/main
    13    Required reviewers           False          True          d28cd374-e7f0-4b1f-ad60-f349f155d47c  refs/heads/main
    

    显示策略的详细信息

    若要显示任何策略的详细信息,请使用 az repos policy show

    az repos policy show --id
                         [--detect {false, true}]
                         [--org]
                         [--project]
                         [--query-examples]
                         [--subscription]
    org, organization
    Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或未通过 git 配置选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/project, p
    项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。
    query-examples
    建议的 JMESPath 字符串。 可以复制其中一个查询,并将其粘贴到 --query 参数后,置于双引号中,以查看结果。 可以添加一个或多个位置关键字,以便根据这些关键字提供建议。
    subscription
    订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
    
  • 选择“允许请求者批准自己的更改”以允许 PR 的创建者对其审批进行投票。 否则,创建者仍然可以对 PR 投“批准”票,但他们的投票不会计入最小审阅者数目。

  • 选择“禁止近期的推送者审批自己的更改”以强制实施职责分离。 默认情况下,任何对源分支具有推送权限的人都可以添加提交并对 PR 审批进行投票。 选择此选项意味着最近推送者的投票不计算在内,即便他们通常可以批准自己的更改。

  • 选择“即使某些审阅者投票等待或拒绝,仍允许完成”,以便即使某些审阅者投票反对 PR 仍能完成。 仍必须批准的最小审阅者数目。

  • 在“推送新更改时”:
    • 选择“上一次迭代至少需要获得一个批准”,以要求对上次源分支更改进行至少一次审批投票。
    • 选择“ 重置所有批准投票 (不会将投票重置为拒绝或等待) 删除所有批准投票,而是在源分支更改时保留投票以拒绝或等待。
    • 选择“重置所有代码审阅者投票”,以便每当源分支发生更改时删除所有审阅者投票,包括批准、拒绝或等待的投票。
    • 在“推送新更改时”:
      • 选择“ 每次迭代至少需要一次审批” ,要求对最后一个源分支更改进行至少一次批准投票。 用户的批准不计入该用户之前推送的任何未经批准的迭代。 因此,另一个用户需要对上次迭代进行额外的批准。 Azure DevOps Server 2022.1 及更高版本中的每个迭代至少需要一次批准
      • 选择“上一次迭代至少需要获得一个批准”,以要求对上次源分支更改进行至少一次审批投票。
      • 选择“ 重置所有批准投票 (不会将投票重置为拒绝或等待) 删除所有批准投票,而是在源分支更改时保留投票以拒绝或等待。
      • 选择“重置所有代码审阅者投票”,以便每当源分支发生更改时删除所有审阅者投票,包括批准、拒绝或等待的投票。
      • 如果未选择“请求者可以批准自己的更改”,则拉取请求的创建者仍可以对其拉取请求投“批准”票,但其投票不计入“最小审阅者数目”。
      • 如果任何审阅者拒绝更改,则拉取请求无法完成,除非选择“即使某些审阅者投票等待或拒绝,仍允许完成”。
      • 在将新更改推送到源分支时,可以重置代码审阅者投票。 选择“有新更改时重置代码审阅者投票”。
      • 如果所有其他策略都通过,则创建者可以在所需数量的审阅者批准 PR 后完成该 PR。

        可以使用 az repos policy approver-count 管理拉取请求所需的审批者计数。

        创建审批者计数策略

        若要创建审批者计数策略,请使用 az repos policy approver-count create

        az repos policy approver-count create --allow-downvotes {false, true}
                                              --blocking {false, true}
                                              --branch
                                              --creator-vote-counts {false, true}
                                              --enabled {false, true}
                                              --minimum-approver-count
                                              --repository-id
                                              --reset-on-source-push {false, true}
                                              [--branch-match-type {exact, prefix}]
                                              [--detect {false, true}]
                                              [--org]
                                              [--project]
                                              [--subscription]
        repository-id
        要按完全匹配筛选结果的存储库的 ID。 例如,--repository-ID e556f204-53c9-4153-9cd9-ef41a11e3345。 “必需”。
        reset-on-source-push
        将更改推送到源时重置投票。 接受的值:falsetrue。 “必需”。
        branch-match-type
        使用 branch 参数应用策略。 如果值为 exact,则该策略适用于与 --branch 参数完全匹配的分支。 如果值为 prefix,则该策略适用于与 --branch 参数中的前缀匹配的所有分支文件夹。 接受的值:exactprefix。 默认值:exactdetect
        自动检测组织。 接受的值:falsetrue。
        Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或未通过 git 配置选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/project, p
        项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。
        subscription
        订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
        

        以下示例将 Fabrikam 存储库 main 分支中的拉取请求所需的最小审批数设置为 2。 该该策略允许投反对票,这意味着即使一些审阅者投票不批准,拉取请求也可以完成,只要投票批准的人数达到最低限度。 推送到源分支不会重置投票。 该策略还允许拉取请求创建者批准自己的拉取请求。

        该示例使用默认配置 az devops configure --defaults organization=https://dev.azure.com/fabrikamprime project="Fabrikam Fiber"

        az repos policy approver-count create --allow-downvotes true --blocking true --branch main --creator-vote-counts true --enabled true --minimum-approver-count 2 --repository-id d28cd374-e7f0-4b1f-ad60-f349f155d47c --reset-on-source-push false --output table ID Name Is Blocking Is Enabled Repository Id Branch ---- --------------------------- ------------- ------------ ------------------------------------ --------------- 27 Minimum number of reviewers True True d28cd374-e7f0-4b1f-ad60-f349f155d47c refs/heads/main

        更新审批者计数策略

        若要更新审阅者计数策略,请使用 az repos policy approver-count update

        az repos policy approver-count update --id
                                              [--allow-downvotes {false, true}]
                                              [--blocking {false, true}]
                                              [--branch]
                                              [--branch-match-type {exact, prefix}]
                                              [--creator-vote-counts {false, true}]
                                              [--detect {false, true}]
                                              [--enabled {false, true}]
                                              [--minimum-approver-count]
                                              [--org]
                                              [--project]
                                              [--repository-id]
                                              [--reset-on-source-push {false, true}]
                                              [--subscription]
        branch-match-type
        使用 branch 参数应用策略。 如果值为 exact,则该策略适用于与 --branch 参数完全匹配的分支。 如果值为 prefix,则该策略适用于与 --branch 参数中的前缀匹配的所有分支文件夹。 接受的值:exactprefix。 默认值:exactcreator-vote-counts
        计算创建者的投票。 接受的值:falsetruedetect
        自动检测组织。 接受的值:falsetrueenabled
        启用策略。 接受的值:falsetrueminimum-approver-count
        所需的最小审批者数。 例如:2。
        Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或未通过 git 配置选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/project, p
        项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。
        repository-id
        要按完全匹配筛选结果的存储库的 ID。 例如,--repository-ID e556f204-53c9-4153-9cd9-ef41a11e3345reset-on-source-push
        将更改推送到源时重置投票。 接受的值:falsetruesubscription
        订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
        

        创建工作项链接策略

        使用 az repos policy work-item-linking create 为存储库或分支创建工作项链接策略。

        az repos policy work-item-linking create --blocking {false, true}
                                                 --branch
                                                 --enabled {false, true}
                                                 --repository-id
                                                 [--branch-match-type {exact, prefix}]
                                                 [--detect {false, true}]
                                                 [--org]
                                                 [--project]
                                                 [--subscription]
        repository-id
        要按完全匹配筛选结果的存储库的 ID。 例如,--repository-ID e556f204-53c9-4153-9cd9-ef41a11e3345branch-match-type
        使用 branch 参数应用策略。 如果值为 exact,则该策略适用于与 --branch 参数完全匹配的分支。 如果值为 prefix,则该策略适用于与 --branch 参数中的前缀匹配的所有分支文件夹。 接受的值:exactprefix。 默认值:exactdetect
        自动检测组织。 接受的值:falsetrue。
        Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或未通过 git 配置选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/project, p
        项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。
        subscription
        订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
        

        更新工作项链接策略

        使用 az repos policy work-item-linking update 更新存储库或一个或多个分支的工作项链接策略。

        az repos policy work-item-linking update --id
                                                 [--blocking {false, true}]
                                                 [--branch]
                                                 [--branch-match-type {exact, prefix}]
                                                 [--detect {false, true}]
                                                 [--enabled {false, true}]
                                                 [--org]
                                                 [--project]
                                                 [--repository-id]
                                                 [--subscription]
        branch-match-type
        使用 branch 参数应用策略。 如果值为 exact,则该策略适用于与 --branch 参数完全匹配的分支。 如果值为 prefix,则该策略适用于与 --branch 参数中的前缀匹配的所有分支文件夹。 接受的值:exactprefix。 默认值:exactdetect
        自动检测组织。 接受的值:falsetrueenabled
        启用策略。 接受的值:falsetrueminimum-approver-count
        所需的最小审批者数。 例如:2。
        Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或未通过 git 配置选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/project, p
        项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。
        repository-id
        要按完全匹配筛选结果的存储库的 ID。 例如,--repository-ID e556f204-53c9-4153-9cd9-ef41a11e3345subscription
        订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
        

        以下示例更新 Fabrikam 存储库的 main 分支的策略 ID 3,使其启用但可选。 该示例使用默认配置 az devops configure --defaults organization=https://dev.azure.com/fabrikamprime project="Fabrikam Fiber"

        >az repos policy work-item-linking update --id 3 --blocking false --branch main --enabled true --repository-id d28cd374-e7f0-4b1f-ad60-f349f155d47c --output table
        ID    Name               Is Blocking    Is Enabled    Repository Id                         Branch
        ----  -----------------  -------------  ------------  ------------------------------------  ---------------
        3     Work item linking  False          True          d28cd374-e7f0-4b1f-ad60-f349f155d47c  refs/heads/main
        

        本地 Azure DevOps Server 不支持 Azure DevOps CLI 命令。

        可以使用 Azure DevOps CLI az repos policy comment-required 来设置和更新注释解决情况策略。

        创建注释解决情况策略

        若要创建注释解决情况策略,请使用 az repos policy comment-required create

        az repos policy comment-required create --blocking {false, true}
                                                --branch
                                                --enabled {false, true}
                                                --repository-id
                                                [--branch-match-type {exact, prefix}]
                                                [--detect {false, true}]
                                                [--org]
                                                [--project]
                                                [--subscription]
        repository-id
        要按完全匹配筛选结果的存储库的 ID。 例如,--repository-ID e556f204-53c9-4153-9cd9-ef41a11e3345。 “必需”。
        branch-match-type
        使用 branch 参数应用策略。 如果值为 exact,则该策略适用于与 --branch 参数完全匹配的分支。 如果值为 prefix,则该策略适用于与 --branch 参数中的前缀匹配的所有分支文件夹。 接受的值:exactprefix。 默认值:exactdetect
        自动检测组织。 接受的值:falsetrue。
        Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或未通过 git 配置选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/project, p
        项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。
        subscription
        订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
        

        更新注释解决情况策略

        若要更新注释解决情况策略,请使用 az repos policy comment-required update

        az repos policy comment-required update --id
                                                [--blocking {false, true}]
                                                [--branch]
                                                [--branch-match-type {exact, prefix}]
                                                [--detect {false, true}]
                                                [--enabled {false, true}]
                                                [--org]
                                                [--project]
                                                [--repository-id]
                                                [--subscription]
        branch-match-type
        使用 branch 参数应用策略。 如果值为 exact,则该策略适用于与 --branch 参数完全匹配的分支。 如果值为 prefix,则该策略适用于与 --branch 参数中的前缀匹配的所有分支文件夹。 接受的值:exactprefix。 默认值:exactdetect
        自动检测组织。 接受的值:falsetrueenabled
        启用策略。 接受的值:falsetrue。
        Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或未通过 git 配置选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/project, p
        项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。
        repository-id
        要按完全匹配筛选结果的存储库的 ID。 例如,--repository-ID e556f204-53c9-4153-9cd9-ef41a11e3345subscription
        订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
        

        以下示例更新 Fabrikam 存储库 main 分支中的注释解决情况策略 ID 6将其设为阻止。 必须先解决注释,然后才能合并拉取请求。 该示例使用默认配置 az devops configure --defaults organization=https://dev.azure.com/fabrikamprime project="Fabrikam Fiber"

        az repos policy comment-required update --id 6 --blocking true --output table
        ID    Name                  Is Blocking    Is Enabled    Repository Id                         Branch
        ----  --------------------  -------------  ------------  ------------------------------------  ---------------
        6     Comment requirements  True           True          d28cd374-e7f0-4b1f-ad60-f349f155d47c  refs/heads/main
        

        本地 Azure DevOps Server 不支持 Azure DevOps CLI 命令。

      • 基本合并(无快进)在目标中创建一个合并提交,其父级是目标和源分支。
      • Squash 合并使用源分支中的更改在目标分支中创建具有单个提交的线性历史记录。 详细了解压缩合并及其如何影响分支历史记录。
      • 变基和快进通过在不合并提交的情况下将源提交重播到目标分支来创建线性历史记录。
      • “通过合并提交变基”将源提交重播至目标,并创建合并提交。
      • 可以使用 Azure DevOps CLI az repos policy merge-strategy 设置和更新合并策略。

        创建合并策略

        使用 az repos policy merge-strategy create 创建合并策略。

        az repos policy merge-strategy create --blocking {false, true}
                                              --branch
                                              --enabled {false, true}
                                              --repository-id
                                              [--allow-no-fast-forward {false, true}]
                                              [--allow-rebase {false, true}]
                                              [--allow-rebase-merge {false, true}]
                                              [--allow-squash {false, true}]
                                              [--branch-match-type {exact, prefix}]
                                              [--detect {false, true}]
                                              [--org]
                                              [--project]
                                              [--subscription]
                                              [--use-squash-merge {false, true}]
        repository-id
        要按完全匹配筛选结果的存储库的 ID。 例如,--repository-ID e556f204-53c9-4153-9cd9-ef41a11e3345。 “必需”。
        allow-no-fast-forward
        基本合并(无快进)。 将开发过程中出现的非线性历史记录原原本本地保留。 接受的值:falsetrueallow-rebase
        变基和快进。 通过将源分支的提交内容重播至目标分支(且不使用合并提交),创建线性历史记录。 接受的值:falsetrueallow-rebase-merge
        通过合并提交变基。 通过将源分支的提交内容重播至目标分支并创建合并提交,创建半线性历史记录。 接受的值:falsetrueallow-squash
        压缩合并。 通过将源分支的提交内容压缩进目标分支上的单个新提交,创建线性历史记录。 接受的值:falsetruebranch-match-type
        使用 branch 参数应用策略。 如果值为 exact,则该策略适用于与 --branch 参数完全匹配的分支。 如果值为 prefix,则该策略适用于与 --branch 参数中的前缀匹配的所有分支文件夹。 接受的值:exactprefix。 默认值:exactdetect
        自动检测组织。 接受的值:falsetrue。
        Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或未通过 git 配置选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/project, p
        项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。
        subscription
        订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
        use-squash-merge
        始终压缩合并。 此选项不适用于其他合并类型。 接受的值:falsetrue

        注意:use-squash-merge 已弃用,并将从未来版本中删除。 请改用 --allow-squash

        以下示例为 Fabrikam 存储库 main 分支中的拉取请求设置所需的合并策略,以允许压缩合并。 该示例使用默认配置 az devops configure --defaults organization=https://dev.azure.com/fabrikamprime project="Fabrikam Fiber"

        az repos policy merge-strategy create --allow-squash true --blocking true --branch main --enabled true --repository-id d28cd374-e7f0-4b1f-ad60-f349f155d47c --output table
        ID    Name                      Is Blocking    Is Enabled    Repository Id                         Branch
        ----  ------------------------  -------------  ------------  ------------------------------------  ---------------
        29    Require a merge strategy  True           True          d28cd374-e7f0-4b1f-ad60-f349f155d47c  refs/heads/main
        

        更新合并策略

        使用 az repos policy merge-strategy update 更新合并策略。

        az repos policy merge-strategy update --id
                                              [--allow-no-fast-forward {false, true}]
                                              [--allow-rebase {false, true}]
                                              [--allow-rebase-merge {false, true}]
                                              [--allow-squash {false, true}]
                                              [--blocking {false, true}]
                                              [--branch]
                                              [--branch-match-type {exact, prefix}]
                                              [--detect {false, true}]
                                              [--enabled {false, true}]
                                              [--org]
                                              [--project]
                                              [--repository-id]
                                              [--subscription]
                                              [--use-squash-merge {false, true}]
        branch-match-type
        使用 branch 参数应用策略。 如果值为 exact,则该策略适用于与 --branch 参数完全匹配的分支。 如果值为 prefix,则该策略适用于与 --branch 参数中的前缀匹配的所有分支文件夹。 接受的值:exactprefix。 默认值:exactdetect
        自动检测组织。 接受的值:falsetrueenabled
        启用策略。 接受的值:falsetrue。
        Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或未通过 git 配置选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/project, p
        项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。
        repository-id
        要按完全匹配筛选结果的存储库的 ID。 例如,--repository-ID e556f204-53c9-4153-9cd9-ef41a11e3345subscription
        订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
        use-squash-merge
        是否始终压缩合并。 此选项不适用于其他合并类型。 接受的值:falsetrue

        可以设置一个策略,要求在 PR 完成之前成功生成 PR 更改。 生成策略可减少中断并保持测试结果通过。 即使在开发分支上使用持续集成 (CI) 来及早发现问题,生成策略也会有所帮助。

        创建新 PR 或将更改推送到面向分支的现有 PR 时,生成验证策略会将新生成排入队列。 生成策略会评估生成结果,以确定 PR 是否可以完成。

        在指定生成验证策略之前,必须具有生成管道。 如果没有管道,请参阅创建生成管道。 选择与项目类型匹配的生成类型。

      • 在“触发器”下,选择“自动(每当更新源分支)”或“手动”。

      • 在“策略要求”下,选择“必需”或“可选”。 如果选择“必需”,则生成必须成功完成才能完成 PR。 选择“可选”可在生成失败时发送通知,但仍允许 PR 完成。

      • 设置生成过期时间,以确保对受保护分支的更新不会中断打开的 PR 的更改。

      • 更新 <分支名称> 后立即:每当分支更新时,此选项将 PR 生成策略状态设置为“失败”,并将生成重新排入队列。 此设置可确保即使受保护分支更改,PR 更改也能成功生成。

        此选项最适合重要分支几乎没有更改的团队。 使用繁忙开发分支的团队可能会发现,每次分支更新时等待生成都会造成中断。

      • 如果 <分支名称> 已更新,则在 <n> 小时后:如果传递的生成早于输入的阈值,则当受保护的分支更新时,此选项将使当前策略状态过期。 此选项是在受保护分支更新时始终或从不需要生成之间的折衷。 当受保护分支频繁更新时,此选项可以减少生成数。

      • 从不:对受保护分支的更新不会更改策略状态。 此值可减少生成数,但在完成最近未更新的 PR 时可能会导致问题。

      • 为此生成策略输入可选的显示名称。 此名称标识“分支策略”页上的策略。 如果未指定显示名称,则策略将使用生成管道名称。

      • 选择“保存”。

        当 PR 所有者推送成功生成的更改时,策略状态会更新。

        如果具有“更新 <分支名称> 后立即”或“如果 <分支名称> 已更新,则在 <n> 小时后”生成策略,则策略状态会随受保护分支更新而更新,前提是先前的生成不再有效。

        此功能适用于 Azure DevOps Server 2020 及更高版本。

        可以使用 Azure DevOps CLI az repos policy build 来设置和更新生成验证策略。

        创建生成验证策略

        使用 az repos policy build create 创建生成验证策略。

        az repos policy build create --blocking {false, true}
                                     --branch
                                     --build-definition-id
                                     --display-name
                                     --enabled {false, true}
                                     --manual-queue-only {false, true}
                                     --queue-on-source-update-only {false, true}
                                     --repository-id
                                     --valid-duration
                                     [--branch-match-type {exact, prefix}]
                                     [--detect {false, true}]
                                     [--org]
                                     [--path-filter]
                                     [--project]
                                     [--subscription]
        repository-id
        要按完全匹配筛选结果的存储库的 ID。 例如,--repository-ID e556f204-53c9-4153-9cd9-ef41a11e3345。 “必需”。
        valid-duration
        策略有效期(以分钟为单位)。 注意:valid-duration 必须介于零至一年之间,并且当 --queue-on-source-update-onlyfalse 时必须为零。 “必需”。
        branch-match-type
        使用 branch 参数应用策略。 如果值为 exact,则该策略适用于与 --branch 参数完全匹配的分支。 如果值为 prefix,则该策略适用于与 --branch 参数中的前缀匹配的所有分支文件夹。 接受的值:exactprefix。 默认值:exactdetect
        自动检测组织。 接受的值:falsetrue。
        Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或通过 git 配置进行选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/path-filter
        应用策略的路径。 支持绝对路径、通配符和以 ; 分隔的多个路径。 示例:/WebApp/Models/Data.cs/WebApp/**.cs,/WebApp/Models/Data.cs;ClientApp/Models/Data.csproject, p
        项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。
        subscription
        订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
        

        以下示例为 Fabrikam 存储库的 main 分支中的拉取请求设置了必需的生成策略。 该策略要求成功生成生成定义 ID 1,并且仅允许手动生成队列。 该示例使用默认配置 az devops configure --defaults organization=https://dev.azure.com/fabrikamprime project="Fabrikam Fiber"

        az repos policy build create --blocking true --branch main --build-definition-id 1 --display-name build-policy --enabled true --manual-queue-only true --queue-on-source-update-only false --repository-id d28cd374-e7f0-4b1f-ad60-f349f155d47c --valid-duration 0 --output table
        ID    Name          Is Blocking    Is Enabled    Repository Id                         Branch
        ----  ------------  -------------  ------------  ------------------------------------  ---------------
        31    build-policy  True           True          d28cd374-e7f0-4b1f-ad60-f349f155d47c  refs/heads/main
        

        更新生成验证策略

        使用 az repos policy build update 更新生成验证策略。

        az repos policy build update --id
                                     [--blocking {false, true}]
                                     [--branch]
                                     [--branch-match-type {exact, prefix}]
                                     [--build-definition-id]
                                     [--detect {false, true}]
                                     [--display-name]
                                     [--enabled {false, true}]
                                     [--manual-queue-only {false, true}]
                                     [--org]
                                     [--path-filter]
                                     [--project]
                                     [--queue-on-source-update-only {false, true}]
                                     [--repository-id]
                                     [--subscription]
                                     [--valid-duration]
        branch-match-type
        使用 branch 参数应用策略。 如果值为 exact,则该策略适用于与 --branch 参数完全匹配的分支。 如果值为 prefix,则该策略适用于与 --branch 参数中的前缀匹配的所有分支文件夹。 接受的值:exactprefix。 默认值:exactbuild-definition-id
        生成定义 ID。
        detect
        自动检测组织。 接受的值:falsetruedisplay-name
        此生成策略的显示名称,用于标识策略。 例如:Manual queue policyenabled
        启用策略。 接受的值:falsetruemanual-queue-only
        是否仅允许手动将生成排入队列。 接受的值:falsetrue。
        Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或通过 git 配置进行选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/path-filter
        应用策略的路径。 支持绝对路径、通配符和以 ; 分隔的多个路径。 示例:/WebApp/Models/Data.cs/WebApp/**.cs,/WebApp/Models/Data.cs;ClientApp/Models/Data.csproject, p
        项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。
        queue-on-source-update-only
        是否仅在源更新时将生成排入队列。 接受的值:falsetruerepository-id
        要按完全匹配筛选结果的存储库的 ID。 例如,--repository-ID e556f204-53c9-4153-9cd9-ef41a11e3345subscription
        订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
        valid-duration
        策略有效期(以分钟为单位)。
        

        设置一个策略,要求在拉取请求中进行更改,以便在完成拉取请求之前使用受保护的分支成功生成。 生成策略可减少中断并保持测试结果通过。 即使在开发分支上使用持续集成 (CI) 来及早发现问题,生成策略也会有所帮助。

        如果启用了生成验证策略,则在创建新的拉取请求或将更改推送到针对分支的现有拉取请求时,新生成将排入队列。 然后,生成策略会评估生成结果,以确定拉取请求是否可以完成。

        在指定生成验证策略之前,必须具有生成定义。 如果没有,请参阅创建生成定义并选择与项目类型匹配的生成类型。

        选择“添加生成策略”,然后在“添加生成策略”中配置选项。

      • 选择“生成定义”。

      • 选择触发器类型。 选择“自动(每当更新源分支)”或“手动”。

      • 选择“策略要求”。 如果选择“必需”,则生成必须成功完成才能完成拉取请求。 选择“可选”可在生成失败时发送通知,但仍允许拉取请求完成。

      • 设置生成过期时间,以确保对受保护分支的更新不会中断打开的拉取请求的更改。

      • 更新 branch name 后立即:当受保护分支更新后,此选项将拉取请求中的生成策略状态设置为“失败”。 将生成重新排入队列以刷新生成状态。 此设置可确保即使受保护分支更改,拉取请求中的更改也能成功生成。 此选项最适合拥有重要分支且变更量较小的团队。 使用繁忙开发分支的团队可能会发现,每次更新受保护的分支时,等待生成完成都会造成中断。
      • 如果 branch name 已更新,则在 n 小时后:如果传递的生成早于输入的阈值,则当受保护的分支更新时,此选项将使当前策略状态过期。 此选项是在受保护分支更新时始终要求生成和从不需要生成之间的折衷。 此选项非常适合在受保护分支频繁更新时减少生成数。
      • 从不:对受保护分支的更新不会更改策略状态。 此值可减少分支的生成数。 关闭最近未更新的拉取请求时,可能会导致问题。
      • 为此生成策略输入可选的显示名称。 此名称标识“分支策略”页上的策略。 如果未指定显示名称,则策略将使用生成定义名称。

      • 选择“保存”。

        当所有者推送成功生成的更改时,策略状态将更新。 如果选择了“更新 branch name 后立即”或“如果 branch name 已更新,则在 n 小时后”生成策略,则在更新受保护分支后,策略状态也将更新,前提是最新的生成不再有效。

        外部服务可以使用 PR 状态 API 将详细状态发布到 PR。 附加服务的分支策略使这些第三方服务能够参与 PR 工作流和建立策略要求。

        有关配置此策略的说明,请参阅为外部服务配置分支策略

        需要外部服务的审批

        外部服务可以使用 PR 状态 API 将详细状态发布到 PR。 附加服务的分支策略为这些第三方服务提供了参与 PR 工作流和建立策略要求的能力。

        有关配置此策略的说明,请参阅为外部服务配置分支策略

        自动包括代码审阅者

        可以自动将审阅者添加到更改特定目录和文件中文件的拉取请求,或添加到存储库中的所有拉取请求。

      • 指定需要自动包含审阅者的文件和文件夹。 将此字段留空以要求审阅者处理分支中的所有拉取请求。

      • 如果拉取请求所有者可以投票批准自己的拉取请求来满足此策略,请选择“允许请求者批准自己的更改”。

      • 可以指定拉取请求中显示的活动源消息。

      • 选择“保存”。

        可以使用 Azure DevOps CLI az repos policy required-reviewer 来设置和更新所需的审阅者策略。

        创建所需的审阅者策略

        使用 az repos policy required-reviewer create 创建所需的审阅者策略。

        az repos policy required-reviewer create --blocking {false, true}
                                                 --branch
                                                 --enabled {false, true}
                                                 --message
                                                 --repository-id
                                                 --required-reviewer-ids
                                                 [--branch-match-type {exact, prefix}]
                                                 [--detect {false, true}]
                                                 [--org]
                                                 [--path-filter]
                                                 [--project]
                                                 [--subscription]
        repository-id
        要按完全匹配筛选结果的存储库的 ID。 例如,--repository-ID e556f204-53c9-4153-9cd9-ef41a11e3345。 “必需”。
        required-reviewer-ids
        审阅者电子邮件地址(以 ; 分隔)。 例如:john@contoso.com;alice@contoso.combranch-match-type
        使用 branch 参数应用策略。 如果值为 exact,则该策略适用于与 --branch 参数完全匹配的分支。 如果值为 prefix,则该策略适用于与 --branch 参数中的前缀匹配的所有分支文件夹。 接受的值:exactprefix。 默认值:exactdetect
        自动检测组织。 接受的值:falsetrue。
        Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或通过 git 配置进行选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/path-filter
        应用策略的路径。 支持绝对路径、通配符和以 ; 分隔的多个路径。 示例:/WebApp/Models/Data.cs/WebApp/**.cs,/WebApp/Models/Data.cs;ClientApp/Models/Data.csproject, p
        项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。
        subscription
        订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。
        

        以下示例将 Jamal Hartnett 设置为 Fabrikam 存储库 main 分支中拉取请求的必需审阅者。 该示例使用默认配置 az devops configure --defaults organization=https://dev.azure.com/fabrikamprime project="Fabrikam Fiber"

        az repos policy required-reviewer create --blocking true --branch main --enabled true --message "Please review." --repository-id d28cd374-e7f0-4b1f-ad60-f349f155d47c --required-reviewer-ids fabrikamfiber4@hotmail.com --output table
        ID    Name                Is Blocking    Is Enabled    Repository Id                         Branch
        ----  ------------------  -------------  ------------  ------------------------------------  ---------------
        35    Required reviewers  True           True          d28cd374-e7f0-4b1f-ad60-f349f155d47c  refs/heads/main
        

        更新所需的审阅者策略

        使用 az repos policy required-reviewer update 更新所需的审阅者策略。

        az repos policy required-reviewer update --id [--blocking {false, true}] [--branch] [--branch-match-type {exact, prefix}] [--detect {false, true}] [--enabled {false, true}] [--message] [--org] [--path-filter] [--project] [--repository-id] [--required-reviewer-ids] [--subscription] branch-match-type 使用 branch 参数应用策略。 如果值为 exact,则该策略适用于与 --branch 参数完全匹配的分支。 如果值为 prefix,则该策略适用于与 --branch 参数中的前缀匹配的所有分支文件夹。 接受的值:exactprefix。 默认值:exactdetect 自动检测组织。 接受的值:falsetrueenabled 启用策略。 接受的值:falsetruemessage 拉取请求中显示的活动源消息。 Azure DevOps 组织 URL。 可以使用 az devops configure -d organization=<ORG_URL> 配置默认组织。 如果未配置为默认或通过 git 配置进行选取,则为必需。示例:https://dev.azure.com/MyOrganizationName/path-filter 应用策略的路径。 支持绝对路径、通配符和以 ; 分隔的多个路径。 示例:/WebApp/Models/Data.cs/WebApp/**.cs,/WebApp/Models/Data.cs;ClientApp/Models/Data.csproject, p 项目的名称或 ID。 可以使用 az devops configure -d project=<NAME_OR_ID> 配置默认项目。 如果未配置为默认或通过 git 配置进行选取,则为必需。 repository-id 要按完全匹配筛选结果的存储库的 ID。 例如,--repository-ID e556f204-53c9-4153-9cd9-ef41a11e3345required-reviewer-ids 审阅者电子邮件地址(以 ; 分隔)。 例如:john@contoso.com;alice@contoso.comsubscription 订阅的名称或 ID。 可以使用 az account set -s <NAME_OR_ID> 配置默认订阅。

        绕过分支策略

        在某些情况下,可能需要绕过策略要求。 通过绕过权限,可以直接将更改推送到分支,或完成不符合分支策略的拉取请求。 可以向用户或组授予绕过权限。 可以将绕过权限的范围限定为整个项目、存储库或单个分支。

        以下两种权限允许用户以不同方式绕过分支策略:

      • 完成拉取请求时的绕过策略 - 仅适用于拉取请求完成。 即使拉取请求不符合策略,具有此权限的用户也可以完成拉取请求。

      • 推送时绕过策略 - 适用于来自本地存储库的推送和在 Web 上进行的编辑。 具有此权限的用户可以将更改直接推送到受保护的分支,而无需满足策略要求。

        有关管理这些权限的详细信息,请参阅 Git 权限

        在 TFS 2015 到 TFS 2018 Update 2 中,具有“免除策略实施”权限的用户可执行以下操作:

      • 完成拉取请求时,即使不满足当前分支策略集,也可以选择覆盖策略并完成拉取请求。
      • 即使该分支设置了分支策略,也直接推送到该分支。 请注意,当具有此权限的用户进行替代分支策略的推送时,推送会自动绕过分支策略,且没有选择启用步骤或警告。
      • 授予绕过策略的权限时要小心,尤其是在存储库和项目级别。 策略是安全且合规的源代码管理的基石。

        路径筛选器

        多个分支策略提供路径筛选器。 如果设置了路径筛选器,则策略仅应用于与路径筛选器匹配的文件。 将此字段留空意味着该策略将应用于分支中的所有文件。

        可以指定绝对路径(路径必须以 / 或通配符开头)和通配符。

      • /WebApp/Models/Data.cs
      • /WebApp/*
      • */Models/Data.cs
      • 可以使用 ; 作为分隔符来指定多个路径。

      • /WebApp/Models/Data.cs;/ClientApp/Models/Data.cs
      • ! 为前缀的路径将被排除在外(原本会将其包括在内)。

      • /WebApp/*;!/WebApp/Tests/* 包括 /WebApp 中的所有文件,/WebApp/Tests 中的文件除外
      • !/WebApp/Tests/* 不指定任何文件,因为一开始不包含任何内容
      • 筛选器的顺序非常重要。 筛选器从左到右应用。

      • 能否将更改直接推送到具有分支策略的分支?
      • 什么是自动完成?
      • 何时检查分支策略条件?
      • 能否在分支策略中使用 XAML 生成定义?
      • 对于所需的代码审阅者,可以使用哪些通配符?
      • 所需的代码审阅者路径是否区分大小写?
      • 如何将多个用户配置为所需的审阅者,但只需要其中一个用户批准?
      • 我具有绕过策略权限。 为什么在拉取请求状态中仍会看到策略失败?
      • 为什么设置“允许请求者批准自己的更改”后,仍无法完成自己的拉取请求?
      • 如果路径筛选器中的路径既不以 / 开头也不以通配符开头时会发生什么情况?
      • 能否将更改直接推送到具有分支策略的分支?

        除非你有权绕过分支策略,否则无法将更改直接推送到具有必需分支策略的分支。 只能通过拉取请求对这些分支进行更改。 如果没有必需的分支策略,可以将更改直接推送到具有可选分支策略的分支。

        什么是自动完成?

        将请求拉取到配置了分支策略的分支中,具有“设置自动完成”按钮。 选择此选项可在满足所有策略后自动完成拉取请求。 当预计更改不会出现任何问题时,自动完成功能非常有用。

        何时检查分支策略条件?

        当拉取请求所有者推送更改和审阅者投票时,分支策略会在服务器上重新评估。 如果策略触发生成,则生成状态将设置为等待生成完成。

        能否在分支策略中使用 XAML 生成定义?

        否,不能在分支策略中使用 XAML 生成定义。

        对于所需的代码审阅者,可以使用哪些通配符?

        单个星号 * 匹配任意数量的字符,包括正斜杠 / 和反斜杠 \。 问号 ? 匹配任何单个字符。

      • *.sql 匹配所有扩展名为 .sql 的文件。
      • /ConsoleApplication/* 匹配名为 ConsoleApplication 的文件夹下的所有文件。
      • /.gitattributes 匹配存储库根目录中的 .gitattributes 文件。
      • */.gitignore 匹配存储库中的任何 .gitignore 文件。
      • 所需的代码审阅者路径是否区分大小写?

        否,分支策略不区分大小写。

        如何将多个用户配置为所需的审阅者,但只需要其中一个用户批准?

        可以将用户添加到组,然后将该组添加为审阅者。 然后,组的任何成员都可以批准以满足策略要求。

        我具有绕过策略权限。 为什么在拉取请求状态中仍会看到策略失败?

        配置的策略始终会评估拉取请求更改。 对于具有绕过策略权限的用户,报告的策略状态仅为建议。 如果具有绕过权限的用户批准,则失败状态不会阻止拉取请求完成。

        为什么设置“允许请求者批准自己的更改”后,仍无法完成自己的拉取请求?

        “需要最少数量的审阅者”策略和“自动包含审阅者”策略都具有“允许请求者批准自己的更改”的选项。 在每个策略中,设置仅适用于该策略。 设置不会影响其他策略。

        例如,拉取请求设置了以下策略:

      • 需要最少数量的审阅者 - 需要至少一个审阅者。
      • 自动包含的审阅者 - 需要你或你作为审阅者加入的团队。
      • “自动包含的审阅者”已启用“允许请求者批准自己的更改”。
      • “需要最少数量的审阅者”未启用“允许请求者批准自己的更改”。
      • 在这种情况下,你的审批满足“自动包含的审阅者”,但不满足“需要最少数量的审阅者”,因此无法完成拉取请求。

        可能还有其他策略(例如“禁止近期的推送者批准自己的更改”),这些策略会阻止你批准自己的更改,即使设置了“允许请求者批准自己的更改”。

        如果路径筛选器中的路径既不以 / 开头也不以通配符开头时会发生什么情况?

        路径筛选器中既不以 / 开头也不以通配符开头的路径将不起作用,并且路径筛选器将像未指定该路径一样进行评估。 这是因为这样的路径无法与绝对文件路径开头的 / 匹配。

      • 关于分支和分支策略
      • 使用配置文件配置 Git 存储库策略
      • 默认 Git 权限(安全性)
      • 设置权限(安全性)
      • 跨服务集成概述
  •