Git 我可以在Azure DevOps中设置默认安全性和/或分支策略吗?

Git 我可以在Azure DevOps中设置默认安全性和/或分支策略吗?,git,azure-devops,azure-devops-rest-api,azure-repos,Git,Azure Devops,Azure Devops Rest Api,Azure Repos,我们使用的是git服务器。每个Azure DevOps项目托管一个或多个git回购。我们有一个惯例,即保持master和develop分支被锁定,但让其他分支保持不受限制 我希望能够在项目层面应用我们的标准规则,并将其作为其中所有回购协议的默认规则: master和develope应拒绝其安全性强制推送 master分支机构需要通过代码审查策略发出请求 到目前为止,我找到的唯一的选择是通过web界面(甚至不是API!)为每个存储库手动设置这些设置。我们至少有200多个存储库,希望避免手动逐个

我们使用的是git服务器。每个Azure DevOps项目托管一个或多个git回购。我们有一个惯例,即保持
master
develop
分支被锁定,但让其他分支保持不受限制

我希望能够在项目层面应用我们的标准规则,并将其作为其中所有回购协议的默认规则:

  • master
    develope
    应拒绝其安全性
    强制推送
  • master
    分支机构需要通过代码审查策略发出请求
到目前为止,我找到的唯一的选择是通过web界面(甚至不是API!)为每个存储库手动设置这些设置。我们至少有200多个存储库,希望避免手动逐个设置每个回购和分支

如何按分支名称设置默认代码安全性和代码策略?或者通过手动以外的任何方式?

  • 对于跨团队项目(项目级)为多个git存储库设置具有最少审阅者的分支策略,可以使用RESTAPI。具体步骤如下:
1。用于团队项目。

GET https://account.visualstudio.com/DefaultCollection/ProjectName/_apis/git/repositories?api-version=1.0
然后保存输出中的每个git repo id和名称

2。按照repo id在代码的第1步中循环获得的存储库,并针对每个主分支(假设这里的最小审阅者数量为2)

应用程序/json:

{
  "isEnabled": true,
  "isBlocking": true,
  "type": {
    "id": "fa4e907d-c16b-4a4c-9dfa-4906e5d171dd"
  },
  "settings": {
                "minimumApproverCount": 2,
                "creatorVoteCounts": false,
                "allowDownvotes": false,
                "scope": [
                    {
                        "refName": "refs/heads/master",
                        "matchKind": "Exact",
                        "repositoryId": "{repo id}"
                    }
                ]
  }
}
  • 对于设置分支安全性(强制推送作为拒绝),没有这样的RESTAPI,我发布了一个用户声音,您可以投票并跟进

要编写存储库和分支安全性的脚本,可以使用
tfsseecurity.exe
或新的权限REST API或:

对于特定分支,请在令牌末尾添加
/refs^heads^master/

节选 如果您以前深入研究过Azure DevOps的安全内部,您会发现某些权限被授予个人或组,并且链接到令牌。这个令牌通常由一个根对象和一堆guid构建而成。例如,这是特定Git存储库的令牌:

repoV2/daec401a-49b6-4758-adb5-3f65fd3264e3/f59f38e0-e8c4-45d5-8dee-0d20e7ada1b7
^      ^                                    ^
|      |                                    |
|      |                                    -- The Git Repository
|      -- The Team Project Guid
|
-- The root object (Repositories)
我所知道的查找这些详细信息的最简单方法是捕获权限更改时发出的web请求:

您可以使用您喜爱的浏览器中的Web Developer工具来查找所需的令牌。 一旦理解了这一点,就很容易找到“团队项目中的所有存储库”令牌。只需在末尾去掉Git存储库GUID:

repoV2/daec401a-49b6-4758-adb5-3f65fd3264e3b7/
^      ^                                    
|      |                                    
|      -- The Team Project Guid
|
-- The root object (Repositories)
repoV2/
^                                          
|
-- The root object (Repositories)
并且,使用相同的推理,获得“项目集合/组织中的所有存储库”标记。只需在末尾去掉团队项目GUID:

repoV2/daec401a-49b6-4758-adb5-3f65fd3264e3b7/
^      ^                                    
|      |                                    
|      -- The Team Project Guid
|
-- The root object (Repositories)
repoV2/
^                                          
|
-- The root object (Repositories)
现在我们有了这个令牌,我们可以使用tfssecurity设置组织级git权限:

tfssecurity /a+ "Git Repositories" repoV2/ "PullRequestBypassPolicy" adm: ALLOW /collection:https://dev.azure.com/org
            ^   ^                  ^       ^                         ^    ^
            |   |                  |       |                         |    -- Allow or Deny the permission 
            |   |                  |       |                         -- The Group (in this case "Project Collection Administrators")
            |   |                  |       -- The Permission we want to set
            |   |                  -- The Token we found above
            |   -- The Secuity Namespace
            -- Add  (a+) or Remove (a-) this permission
正如您在下面看到的,这个技巧实际上是有效的:)

您可以使用相同的技术来保护分支。分支的令牌使用存储库的令牌作为基础,并将分支添加到存储库中。因为
/
是令牌分隔符,所以分支引用通过将
/
替换为
^
来转义。因此,
refs/heads/master
变成:
refs^heads^master

repoV2/daec401a-49b6-4758-adb5-3f65fd3264e3/f59f38e0-e8c4-45d5-8dee-0d20e7ada1b7/refs^heads^master/
^      ^                                    ^                                    ^
|      |                                    |                                    |
|      |                                    |                                    -- The branch
|      |                                    -- The Git Repository
|      -- The Team Project Guid
|
-- The root object (Repositories)

通过最近的更新,您现在可以通过UI本身进行配置

现在,管理员可以在特定分支或默认分支上设置策略 跨项目中的所有存储库进行分支

只需转到“项目设置”=>“交叉回购政策”

唯一需要注意的是,作为一项最新的更改,这将仅适用于Azure Devops云服务,而不适用于Azure Devops服务器部署。因此,如果您使用的是服务器版本,则可能需要等待一段时间


您可以参考此url:

为分支安全性编写脚本,请参阅:您还可以将
repositoryId
设置为
null
以将其应用于所有当前和未来的存储库。您可以将分支筛选器设置为
前缀
以配置所有功能分支或所有发布分支,只要您采用通用命名模式。见: