2017-07-14 21 views
1

MSのドキュメントによると、VSTS用の 'refs' APIは、特定のコミットから新しいブランチを作成できるようにする必要がありますが、動作させることができません。ここで私は(PowerShellで)持ってPOCのコードは次のとおりです。VSTS REST refs API for GITブランチ作成

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

リクエストボディを書き込み、ホスト文によって報告されたように、正しくフォーマットされた、と私は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 

は、誰もが成功し、新たなREF(ブランチやタグ)を作成するには、このAPIを使用していますし、もしそうなら、あなたは私が私が何を特定するのに役立ちます間違っている?以下は、APIに関するMSのドキュメントへのリンクです。事前にお寄せいただきありがとうございます!

Git Refs : VSTS REST API Documentation

答えて

3

はそれを見つけた、と私のコード例では、それを修正しました。この仕事をするために考慮すべき2つのこと。まず、PSObjectを使用してJSONに変換する場合、パイプ "|"を使用しないでください。 1つの項目の配列を非配列に平坦化するので変換の方法。要求本体にコレクション/配列(角括弧)が含まれていない場合は、要求を読み取ることができません。あなたのコードをテストするとき

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

第二には、あなたがリクエストボディでPSObjectとは対照的に、JSONの文字列を変換渡すことを確認します(それは私の一部に「DOH!」瞬間でした)。この例のコードは実際には、それに応じてuriの括弧で囲まれた情報を置き換えると、コミットIDから新しいブランチを作成します:

$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; 
関連する問題