【问题标题】:Azure Dev Ops REST API - Is there a way to get the final cumulative changes in a pull requestAzure Devops REST API - 有没有办法在拉取请求中获得最终的累积更改
【发布时间】:2021-01-16 17:19:46
【问题描述】:

我想获取包含在拉取请求中的所有文件内容。我尝试了其余 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. 在提交 1 中更改了文件 A。在提交 1 中也添加了新文件 B。
  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 来计算这一点,但希望有一个好方法获取拉取请求的最终视图,以及它的文件内容。

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

【问题讨论】:

    标签: git azure-devops pull-request azure-rest-api


    【解决方案1】:

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

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

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

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

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

    $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?

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

    【讨论】:

    • 谢谢!很高兴知道我没有错过实现它的好方法。我只会“计算”每个文件的最新更改。
    猜你喜欢
    • 1970-01-01
    • 2019-12-03
    • 2021-04-20
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 2020-06-27
    相关资源
    最近更新 更多