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

默认分支是 Git 将在新克隆上签出的第一个分支。 此外, 拉取请求 默认面向此分支。

我们将演练更改默认分支的过程。 我们还将介绍在进行此更改时必须考虑和更新的其他事项。 最后,我们将介绍一个用于缓解转换的工具。

设置新的默认分支

可以使用分支,而不是 main 用于新更改或更改存储库中开发的主线。 若要更改新存储库的默认分支名称,请参阅 “所有存储库”设置和策略

若要更改存储库的默认分支以合并新的拉取请求,至少需要两个分支。 如果只有一个分支,则它已是默认值。 必须创建第二个分支才能更改默认值。

此过程可能需要 设置 Git 存储库权限

  • 项目存储库 下,选择 “分支 ”。

  • “分支 ”页上,选择所需的新默认分支旁边的 “更多”选项 ,然后选择“ 设置为默认分支 ”。

  • 设置新的默认分支后,可以根据需要删除以前的默认值。

    Git 2.28 添加了选择初始分支名称的功能。 同时,Azure Repos、GitHub 和其他 Git 托管提供商添加了选择其他初始分支名称的功能。 以前,默认分支几乎始终命名 master 。 最受欢迎的替代名称是 main 。 不太常见的选项包括 trunk development 。 如果没有你正在使用的工具或团队的任何限制,则任何有效的分支名称都将有效。

    更新其他系统

    更改为其他默认分支时,工作流的其他部分可能会受到影响。 规划更改时,需要考虑到这些部分。

    更新所有管道的 CI 触发器 。 可以在 Web 中编辑设计器管道。 可以在各自的存储库中编辑 YAML 管道。

    外部拉取请求

    将每个打开的拉取请求重定向 到新的默认分支。

    存储库的新克隆将获取新的默认分支。 切换后,具有现有克隆的每个人都应运行 git remote set-head origin -a (替换为 origin 其远程的名称(如果是其他) 更新远程默认分支视图)。 未来的新分支应基于新的默认值。

    需要更新指向Azure Repos中文件的某些书签、文档和其他非代码文件。 文件或目录的分支名称可以显示在 URL 中。

    例如, &version=GBmybranchname 如果 URL 包含查询字符串 version ,则应更新该 URL。 幸运的是,大多数指向默认分支的链接没有段 version ,可以按原样保留。 此外,删除旧默认分支后,尝试导航到该分支时,仍会转到新的默认值。

    Git 存储库只能有一个默认分支。 但是,一段时间后,可以在旧默认值和新默认值之间设置即席镜像。 这样一来,如果最终用户继续推送到旧默认值,则他们不需要恢复其末尾的工作。 我们将使用 Azure Pipelines 设置此临时镜像。

    本部分使用与 Microsoft 的观点 不一致的语言。 具体而言,这个词 master 出现在几个与 Git 中使用方式一致的几个位置。 本主题的目的是说明如何切换到更具包容性的语言,例如 main 。 避免提及 master 这一切将使方向更加难以理解。

    这些说明不是愚蠢的,存储库设置可能需要其他更改,例如松动权限和策略。

    如果在运行此管道之前更新旧分支和新默认分支,则管道将无法镜像更改。 有人必须手动将旧的默认分支 合并 到新的默认分支中,才能使其再次自动运行。

  • 对于所有现有的 CI 版本,请更新它们以针对新的默认分支而不是旧分支 触发

  • 授予生成标识 “参与 ”对存储库的权限。 导航到存储库 (存储库) > 权限 的项目 设置 > 存储库 >。 最多可以有两个标识,一个标识用于项目集合生成服务,另一个标识用于项目生成服务。 确保“参与”权限显示 “允许 ”。

  • 如果新的默认分支具有分支策略,则还会在推送权限时向生成标识授予 “绕过”策略 。 此权限是一种安全风险,因为恶意用户可能会创建管道,以便将代码偷偷进入项目中的存储库。 不再需要镜像时, 请务必 删除此权限。

  • 将新文件 mirror.yml 添加到新的默认分支中的存储库。 在此示例中,我们假定旧的默认分支是 master main 分支。 如果分支名称不同, git push 请更新触发分支和行。

    trigger:
      branches:
        include:
        - master
        - main
    pool: { vmImage: ubuntu-latest }
    steps:
    - checkout: self
      persistCredentials: true
    - script: |
        git checkout $(Build.SourceBranchName)
        git push origin HEAD:master HEAD:main
      displayName: Mirror old and new default branches
    
  • 创建新的管道,在向导中选择“Azure Repos Git”和“现有 Azure Pipelines YAML 文件”。 mirror.yml选择在上一步中添加的文件。 保存并运行管道。
  • 每次推送到或推送main时,此管道都会运行master。 只要新提交未同时到达两个分支,它就会保持同步。

    如果管道开始失败,并显示错误消息,如“汇报 由于推送的分支提示位于其远程后面”,则有人必须手动将旧分支合并到新分支中。

  • 克隆存储库并将其 cd 目录。
  • 如果新的默认分支) ,请查看具有 git checkout main (main 的新默认分支。
  • 创建新的分支以将两个分支与 git checkout -b integrate集成。
  • 如果master旧默认分支) ,请将旧默认分支与 (合并git merge master
  • 推送新分支,然后将拉取请求打开并完成到新的默认分支中。
  • 然后,镜像管道应负责将合并提交镜像回旧默认值。
  •