Azure Dev Ops REST API - есть ли способ получить окончательные совокупные изменения в запросе на вытягивание

Я хочу получить все содержимое файла, включенное в запрос на перенос. Я попробовал остальную конечную точку API https://docs.microsoft.com/en-us/rest/api/azure/devops/git/pull%20request%20commit/get%20pull%20request%20commit?view=azure-DevOps-rest-6.0, и это дает мне все коммиты, содержащиеся в запросе на перенос. Затем я смог получить содержимое файла для этих коммитов. Однако, когда есть несколько коммитов и один и тот же файл был изменен, я получаю старое содержимое файла, которое больше не действует в последней итерации запроса на вытягивание.

Пример:

  1. Файл A изменен в фиксации 1. Новый файл B также был добавлен в фиксацию 1.
  2. Файл A снова изменился при фиксации 2.
  3. Запрос на извлечение создан.

В приведенном выше примере я хочу получить содержимое файла из фиксации 2 для файла A плюс содержимое файла из файла B из фиксации 1. Я мог бы вычислить это, вызвав https://docs.microsoft.com/en-us/rest/api/azure/DevOps/git/pull%20request%20iteration%20changes/get?view=azure-DevOps-rest-6.0, но надеясь, что есть хороший способ получить окончательный вид запроса на вытягивание и его содержимого.

Моя цель - запустить пользовательские проверки файлов в запросе на вытягивание и заблокировать выполнение запроса на вытягивание. Чтобы запустить проверку, мне нужно получить содержимое файла.


person Tom    schedule 01.10.2020    source источник


Ответы (1)


Моя цель - запустить пользовательские проверки файлов в запросе на вытягивание и заблокировать выполнение запроса на вытягивание. Чтобы запустить проверки, мне нужно получить содержимое файла.

Я полностью понимаю ваши потребности, но боюсь, что этого не существует.

Как и в вашем примере, File A изменено в commit 1 и commit 2, мы получим два содержимого из одних и тех же файлов. Но нам просто нужен контент из последнего коммита.

Чтобы решить эту проблему, мы должны пройти через коммиты и записать содержимое измененного файла в каждой фиксации в файл, например .txt, и назвать файл именем измененного файла.

Мы могли бы использовать REST API Фиксации запроса на извлечение - получить фиксации запроса извлечения, чтобы получить все идентификаторы фиксации, мы получаем массив от самого нового к старому, и нам нужно отменить это множество. Таким образом, мы можем начать цикл со старого коммита :

$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 Коммит - получить изменения, чтобы найти измененные файлы и записать их в файл и присвоить им имя измененного файла .

Вы можете проверить следующую ветку для получения более подробной информации:

Как получить отдельный файл из конкретная версия в Git?

Таким образом, содержимое новой фиксации перезапишет старую фиксацию.

person Leo Liu-MSFT    schedule 02.10.2020
comment
Спасибо! Приятно осознавать, что я не упускаю хороший способ добиться этого. Я просто «подсчитаю» последнее изменение для каждого файла. - person Tom; 02.10.2020