Azure Devops REST API - 有没有办法在拉取请求中获取最终的累积更改

Azure Dev Ops REST API - Is there a way to get the final cumulative changes in a pull request

我想获取拉取请求中包含的所有文件内容。我尝试了其余 API 端点 https://docs.microsoft.com/en-us/rest/api/azure/devops/git/pull%20request%20commits/get%20pull%20request%20commits?view=azure-devops-rest-6.0,这确实让我获得了拉取请求中的所有提交。然后我能够检索这些提交的文件内容。但是,当有多个提交并且同一个文件被更改时,我最终得到的旧文件内容在最新的拉取请求迭代中不再有效。

示例:

  1. 文件 A 在提交 1 中更改。新文件 B 也在提交 1 中添加。
  2. 文件 A 在提交 2 中再次更改。
  3. 已创建拉取请求。

在上面的示例中,我想从提交 2 中获取文件 A 的文件内容以及从提交 1 中获取文件 B 的文件内容。我可以通过调用 https://docs.microsoft.com/en-us/rest/api/azure/devops/git/pull%20request%20iteration%20changes/get?view=azure-devops-rest-6.0 来计算这个,但希望有是获取拉取请求及其文件内容的最终视图的好方法。

我的目标是 运行 针对拉取请求中的文件自定义验证并阻止完成拉取请求。为了 运行 验证,我需要获取文件内容。

My goal is to run custom validations against the files in the pull request and block completing the pull request. To run the validations, I need to get the file contents.

我完全理解你的需求,但恐怕没有这样的方法可以实现。

如在您的示例中,File A 更改为 commit 1commit 2,我们将从同一文件中获取两个内容。但是我们应该只需要最新提交的内容。

为了解决这个问题,我们必须循环提交并在每次提交中将修改文件的内容写入一个文件,如.txt,并将文件命名为修改文件的名称.

我们可以使用 REST API Pull Request Commits - Get Pull Request Commits 来获取所有提交的 Id,我们得到从新到旧的数组,我们需要反转这个数组。这样我们就可以从旧的提交开始循环:

$connectionToken="You PAT"
$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))

$url = "https://dev.azure.com/YourOrganization/YourProject/_apis/git/repositories/<repositorieId>/pullRequests/<pullRequestsId>/commits?api-version=6.0"
$Commits = (Invoke-RestMethod -Uri $url -Method Get -UseDefaultCredential -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}) 
$CommitId= $Commits.value.commitId

[array]::Reverse($CommitId)

Write-Host The commit Id is: $CommitId

然后我们可以使用 foreach 循环遍历 commitId 和 REST API Commits - Get Changes 找到修改的文件并 将它们写入文件并用修改后的文件名命名.

您可以查看以下主题以了解更多详细信息:

How to retrieve a single file from a specific revision in Git?

这样,新提交的内容将re-write旧提交。