在Azure DevOps Git中强制执行分支命名规范

14
我们使用托管在Azure DevOps中的Git作为所有源代码。到目前为止,我们已经使用Git Hooks确保团队成员遵循分支命名约定{branchtype}/{username}/{friendlyname}/{workitemtype}{workitemid}
示例:
  • dev/dparkar/addauth/ta123456
  • hf/jsmith/memoryleak/bu11111
分支命名约定使我们清楚地了解它是常规开发分支还是热修复分支以及与哪个工作项相关等其他事项。
为了在本地设置Git Hooks,团队成员需要在开始贡献之前运行一个脚本。这很好,因为脚本除了设置Git Hooks之外还执行其他设置。但是我们不再需要那些额外的设置,因此我们正在寻求完全删除该脚本。
有没有一种方法可以在服务器端强制执行分支命名约定?
我注意到Pull Request Status Server有文档,但想知道是否有某些OTB内容只需在Azure DevOps中进行配置即可。

1
为什么要在分支名称中放置用户名?毕竟提交历史记录会显示文件的作者身份吧? - evolutionxbox
1
它使得在不同的工具中进行排序/筛选变得容易,并显示谁正在处理什么。 - dparkar
2
分支中的用户名有助于定义分支的所有者——负责完成和在完成后删除它的人。 - Palec
3个回答

9

谢谢。那绝对是朝着那个方向迈出的一步。 - dparkar
这似乎需要一个外部的 Windows 工具 tf.exe。我不知道如何获取它。 - Ed Randall
@EdRandall 请参考 https://dev59.com/7m035IYBdhLWcg3wTuFu。 - riQQ
@riQQ 嗯,看起来我后来找到了那个问题并留下了答案,哈哈。 - Ed Randall

7

有两种git钩子:

  • 客户端钩子,适用于本地git存储库。
  • 服务器端钩子,适用于远程存储库(如您使用的VSTS git存储库)。

有关git钩子的更多详细信息,请参阅git书中的Customizing Git - Git Hooks

目前,只支持客户端钩子(例如pre-push hook、pre-commit hook等)用于VSTS git存储库。

服务器端钩子目前不可用(但已在我们的待办事项中),您还可以在this user voice中找到它。一旦未来可用服务器端钩子,例如您可以使用pre-receive hook(或post-receive hook)来检查和强制转换远程存储库中的分支名称。

另外,您问题中的链接使用的是VSTS web hook,与git hooks有很大不同。当然,您可以通过web hook检查和强制转换分支名称,但需要额外的网站接收信息并转换分支名称。详细步骤如下:在VSTS服务Hooks选项卡中添加Web Hook -> 通过代码推送事件触发 -> 输入自己的网站URL -> 测试 -> 确保连接成功 -> 完成。一旦向VSTS git repo推送了新的更改,web hook将被触发,并将信息发送到您的网站。然后您可以检查和转换您的网站中的分支名称并再次推送。

看起来 pre-receive 钩子正在开发中。https://developercommunity.visualstudio.com/idea/365841/add-git-pre-receive-hooks.html - Palec

3
我在构建层面上进行了强制执行,如果分支不符合所需的模式,则使构建流程失败。这种方式有点低效,但只要PR合并规则规定流程必须成功,人们很快就会学会。
将此任务添加到流程中(尽早添加,但需要在检出之后)。
      - task: Bash@3
        displayName: Branch name check
        inputs:
          targetType: inline
          script: |
            echo "##[debug] BUILD_SOURCEBRANCH: [${BUILD_SOURCEBRANCH}]"
            BRANCH="${BUILD_SOURCEBRANCH#refs/heads/}"
            case ${BRANCH} in
              refs/*) ;; # PRs, merges, tags etc.
              release/*) ;;
              feature/*) ;;
              bugfix/*) ;;
              develop) ;;
              *)
                echo "##vso[task.logissue type=error]Branch name [${BRANCH}] does not follow convention: [bugfix/* | feature/* | release/* | develop]."
                echo "##vso[task.complete result=Failed;]"
                ;;
            esac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接