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

Azure DevOps仓库大小API调用404及权限查询问题求助

Azure DevOps仓库大小与权限查询API问题解决

我用Python脚本获取Azure DevOps项目的仓库列表,同时要查询每个仓库的大小和访问权限列表。目前能成功拿到仓库列表,但调用仓库大小的REST API(原用itemsizes端点)返回404错误,权限查询API也无法正常工作。我的PAT已经配置全权限,仓库都有内容,求正确的API端点或解决方法。


一、仓库大小查询的正确方案

原itemsizes端点并非官方用于获取仓库总大小的接口,正确的API是仓库的stats端点,返回数据中包含仓库的总占用字节数:

  • 正确端点格式:{organization_url}/{project_name}/_apis/git/repositories/{repo_id}/stats?api-version=7.1
  • 返回字段:使用sizeInBytes获取仓库总大小

二、仓库权限查询的正确方案

原权限端点逻辑错误,Azure DevOps的权限查询需要针对Git安全命名空间(固定ID:2e9eb7ed-3c0a-47d4-87c1-0ffdd275fd87)发起POST请求,通过请求体指定目标仓库的令牌:

  • 正确端点格式:{organization_url}/_apis/securitynamespaces/2e9eb7ed-3c0a-47d4-87c1-0ffdd275fd87/query?api-version=7.1
  • 请求方式:POST,需构造包含仓库令牌的请求体
  • 权限解析:返回的allow字段是权限位掩码,需对应解析为实际权限(如读取、贡献、管理等)

三、修正后的完整脚本

另外注意:原脚本的Authorization头处理错误,Azure DevOps的Basic认证要求将":" + PAT进行Base64编码,而非直接使用PAT。

import requests
import base64

# Azure DevOps organization URL
organization_url = "https://dev.azure.com/your_organization"

# Personal Access Token (PAT) with appropriate permissions
personal_access_token = "your_personal_access_token"

# Project name
project_name = "your_project_name"

# 处理PAT的Basic认证(必须将":PAT"进行Base64编码)
auth_token = base64.b64encode(f":{personal_access_token}".encode()).decode()
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Basic {auth_token}"
}

# 获取仓库列表API
repo_api_url = f"{organization_url}/{project_name}/_apis/git/repositories?api-version=7.1"
response = requests.get(repo_api_url, headers=headers)

if response.status_code == 200:
    repositories = response.json()["value"]

    for repo in repositories:
        repo_name = repo["name"]
        repo_id = repo["id"]
        print(f"\n=== 仓库:{repo_name} ===")

        # 1. 查询仓库大小
        size_api_url = f"{organization_url}/{project_name}/_apis/git/repositories/{repo_id}/stats?api-version=7.1"
        size_response = requests.get(size_api_url, headers=headers)
        if size_response.status_code == 200:
            repo_size = size_response.json()["sizeInBytes"]
            print(f"大小:{repo_size} 字节")
        else:
            print(f"获取大小失败,状态码:{size_response.status_code}")
            print(size_response.text)

        # 2. 查询仓库权限
        security_namespace_id = "2e9eb7ed-3c0a-47d4-87c1-0ffdd275fd87"  # Git安全命名空间固定ID
        access_api_url = f"{organization_url}/_apis/securitynamespaces/{security_namespace_id}/query?api-version=7.1"
        
        # 构造权限查询请求体
        request_body = {
            "query": {
                "tokens": [f"repoV2/{repo_id}"],
                "securityNamespaceId": security_namespace_id,
                "includeExtendedInfo": True
            }
        }
        
        access_response = requests.post(access_api_url, json=request_body, headers=headers)
        if access_response.status_code == 200:
            permissions = access_response.json()["value"][0]["acesDictionary"].values()
            print("访问权限:")
            for ace in permissions:
                user_name = ace.get("displayName", "未知用户")
                # 解析权限位掩码,映射为可读权限
                permission_bits = ace["allow"]
                permission_list = []
                if permission_bits & 1:
                    permission_list.append("读取")
                if permission_bits & 2:
                    permission_list.append("贡献")
                if permission_bits & 4:
                    permission_list.append("管理")
                permission_str = ", ".join(permission_list) if permission_list else "无权限"
                print(f"  用户/组:{user_name},权限:{permission_str}")
        else:
            print(f"获取权限失败,状态码:{access_response.status_code}")
            print(access_response.text)
else:
    print(f"获取仓库列表失败,状态码:{response.status_code}")
    print(response.text)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 03:35:02