为啥用于获取 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订阅