为啥用于获取 TFVC 变更集的 TFS Rest API 仅返回 256 个项目?

Posted

技术标签:

【中文标题】为啥用于获取 TFVC 变更集的 TFS Rest API 仅返回 256 个项目?【英文标题】:Why is TFS Rest API for fetching the TFVC changesets returning only 256 items?为什么用于获取 TFVC 变更集的 TFS Rest API 仅返回 256 个项目? 【发布时间】:2016-11-22 08:17:31 【问题描述】:

为什么用于获取 TFVC 变更集的 TFS Rest API 仅返回 256 个项目。我尝试使用 $Top 获得超过 256 个结果。但是没用。

获取 Git 存储库提交的 API 工作正常。

我指的是https://www.visualstudio.com/en-us/docs/integrate/api/tfvc/changesets

样品请求 https://tfs.domain.com/tfs/defaultcollection/projectname/_apis/tfvc/changesets?$searchCriteria.fromDate=2016-07-12T17:49:01&$skip=0&$top=500

我也尝试不使用 $skip 和 $searchcriteria.fromdate。请帮助我了解如何获得所有结果。

【问题讨论】:

【参考方案1】:

我设法解决了这个奇怪的逻辑(感谢 MSFT 伙计们你们摇滚 :/)。 就我而言,我想获取所有变更集。

1) 您需要获取前 256 个变更集(我使用 orderby 以防响应顺序不同):

<projectName>/_apis/tfvc/changesets?$top=256&orderby=id desc&searchCriteria.itemPath=<your_path>&api-version=1.0

2) 如果您有超过 0 个响应项,则从响应中获取 changesetNumber 的最后一个值。如果为 0 - 你得到了所有的变更集。

3) 从 changesetNumber 开始获取接下来的 256 个项目:

  <projectName>/_apis/tfvc/changesets?searchCriteria.toId=<changesetNumber>&$top=256&orderby=id desc&searchCriteria.itemPath=<your_path>&api-version=1.0

您需要跳过第一个变更集(您已经拥有此值)作为响应。

4) 转到第 2 步

因此您需要将 changesetId 替换为 createdDate 并将 searchCriteria.toId 替换为 searchCriteria.fromDate。 希望我的解决方案对您有所帮助。

附:我在 Connect 网站上找不到任何反馈。

【讨论】:

【参考方案2】:

基于上面的@Vitaly cmets,我已经在豪华here 中实现了解决方案。还提取了以下脚本:

function Get-MaxChangeset($Project, $LastChngset)

    $projectUri = "$rootTfsUri/$($Project.name)/_apis/tfvc/changesets?api-version=3.1&`$top=256&orderby=id desc"
    $lastchangeset = $LastChngset
    if($lastchangeset -ne $null)
        $projectUri += "&searchCriteria.toId=$($lastchangeset.changesetId)"
    

    $nestedsubresponse = Invoke-WebRequest -Uri $projectUri -UseDefaultCredentials -Method Get -Verbose -UseBasicParsing
    $nestedsubresponseObject = $nestedsubresponse.Content | ConvertFrom-Json
    if($nestedsubresponseObject.count -ge 1)
    
        # exclude false positives.
        $lastchangeset = $nestedsubresponseObject.value | `
                    where-object 
                        ($_.checkedInBy.displayName -notlike "*Project Collection Service Accounts*")  | `
                    Sort-Object changesetId -Descending | Select-Object -First 1

        if( ($lastchangeset -eq $null) -and ($nestedsubresponseObject.count -ge 256) )
        
            # More records to search. Pick the bottom from current list and send it back for next batch api call.
            $lastchangeset = $nestedsubresponseObject.value | Sort-Object changesetId | Select-Object -First 1
            $lastchangeset = Get-MaxChangeset $Project $lastchangeset
        
    

    return $lastchangeset


$rootTfsUri = "http://tfs:8080/tfs/DefaultCollection"
$allProjectsUri = "$rootTfsUri/_apis/projects?api-version=3.1&`$top=256"
$projectStats = @
$response = Invoke-WebRequest -Uri $allProjectsUri -UseDefaultCredentials -Method Get -Verbose -UseBasicParsing
$responseObject = $response.Content | ConvertFrom-Json
if($responseObject.count -ge 1)

    foreach($prj in $responseObject.value)
    
        $lastchangeset = Get-MaxChangeset $prj $null
        if($lastchangeset -ne $null)
        
            $projectStats.Add("$($prj.name)", $lastchangeset.createdDate)
        
        else
        
            $projectStats.Add("$($prj.name)", $lastchangeset)
        
    

    $projectStats.GetEnumerator() | Export-Csv "CheckInHistory.csv"

HTH, 山姆

【讨论】:

以上是关于为啥用于获取 TFVC 变更集的 TFS Rest API 仅返回 256 个项目?的主要内容,如果未能解决你的问题,请参考以下文章

无法通过REST API为punlisherId = tfs和eventId tfvc.checkin创建VSTS webhook订阅

使用TFVC从TFS迁移到VSTS

VSTS中的强制性代码审查

如何使用C#(Visual Studio)从TFS(Team Foundation Server)获取/复制文件

如何撤消 TFS 2010 中的变更集回滚?

如何在两个 TFS 标签之间查找变更集(用于发行说明/变更日志)