首页 > 解决方案 > Azure Dev Ops REST API - 有没有办法在拉取请求中获得最终的累积更改

问题描述

我想获取拉取请求中包含的所有文件内容。我尝试了其余的 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但希望有一种获得拉取请求最终视图的好方法,它是文件内容。

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

标签: gitazure-devopspull-requestazure-rest-api

解决方案


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

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

与您的示例一样,在andFile A中进行了更改,我们将从同一个文件中获取两个内容。但我们应该只需要最新提交的内容。commit 1commit 2

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

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

$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

然后我们可以使用REST API Commits-Get Changesforeach循环查找修改后的文件并将它们写入文件并用修改后的文件名命名它们commitId

您可以查看以下线程以获取更多详细信息:

如何从 Git 中的特定修订中检索单个文件?

这样,来自新提交的内容将重写旧提交。


推荐阅读