VSTS REST 引用 API 用于 GIT 分支创建

VSTS REST refs API for GIT branch creation

根据 MS 文档,VSTS 的“refs”API 应该允许您从特定提交创建新分支,但我似乎无法让它工作。这是我的 POC 代码(在 PowerShell 中):

$uri = 'https://{account}.visualstudio.com/{project}/_apis/git/repositories/{repository}/refs?api-version=1.0';

[array]$requestList = @();
$requestObj = New-Object -TypeName psobject;
$requestObj | Add-Member -MemberType NoteProperty -Name "name" -Value 'refs/heads/api-branch1';
$requestObj | Add-Member -MemberType NoteProperty -Name "oldObjectId" -Value "0000000000000000000000000000000000000000";
$requestObj | Add-Member -MemberType NoteProperty -Name "newObjectId" -Value "272c5f931889e5c6cc61a6fdb19ad00eeebf2d77";
$requestList += @($requestObj);

$header = Get-AuthHeader;
$body = ConvertTo-Json -InputObject @($requestList);
Write-Host $body;

$response = Invoke-RestMethod -Uri $uri -Headers $header -Method Post -Body $body -ContentType application/json;

Write-Host $response;

请求正文的格式正确,如 Write-Host 语句所报告的那样,并且我已验证 newObjectId 是正确的提交 ID。但是,当我 运行 脚本时,出现以下错误:

Invoke-RestMethod : {"$id":"1","innerException":null,"message":"Value cannot be null.\r\nParameter name: refUpdates","typeName":"System.ArgumentNullException, mscorlib, Version=14.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089","typeKey":"ArgumentNullException","errorCode":0,"eventId":0}
At C:\Users\gappleton\Documents\VSTS\Scripts\Test-Methods.ps1:119 char:13
+ $response = Invoke-RestMethod -Uri $uri -Headers $header -Method Post ...
+             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

有没有人使用这个 API 成功地创建了一个新的 ref(分支或标签),如果是这样,你能帮我找出我做错了什么吗?以下是 link API 上的 MS 文档,在此先感谢您提供的任何帮助!

Git Refs : VSTS REST API Documentation

找到它,并在我的代码示例中更正了它。完成这项工作需要考虑两件事。首先,如果您正在使用 PSObject 并将其转换为 JSON,请不要使用竖线“|”转换方法,因为它将 1 项的数组展平为非数组。如果请求正文不包含集合/数组(方括号),将无法读取请求。

$body = $requestList | ConvertTo-Json | Out-String; # Flattens one element array
$body = ConvertTo-Json -InputObject @($requestList); # Does not flatten

其次,在测试您的代码时,请确保您传递的是 JSON 转换后的字符串,而不是请求正文中的 PSObject(这是我的 "DOH!" 时刻)。这个示例代码实际上可以从提交 ID 创建一个新分支,一旦你相应地替换了 uri 中的括号信息:

$uri = 'https://{account}.visualstudio.com/{project}/_apis/git/repositories/{repository}/refs?api-version=1.0';

[array]$requestList = @();
$requestObj = New-Object -TypeName psobject;
$requestObj | Add-Member -MemberType NoteProperty -Name "name" -Value 'refs/heads/api-branch1';
$requestObj | Add-Member -MemberType NoteProperty -Name "oldObjectId" -Value "0000000000000000000000000000000000000000";
$requestObj | Add-Member -MemberType NoteProperty -Name "newObjectId" -Value "272c5f931889e5c6cc61a6fdb19ad00eeebf2d77";
$requestList += @($requestObj);

$header = Get-AuthHeader;
$body = ConvertTo-Json -InputObject @($requestList);
Write-Host $body;

$response = Invoke-RestMethod -Uri $uri -Headers $header -Method Post -Body $body -ContentType application/json;

Write-Host $response;