更新时间:2023-02-14 23:20:00
为了后代,您不想使用以下内容从bitbucket下载单个文件:
For posterities sake, you don't want to use the following to download an individual file from bitbucket:
https://api.bitbucket.org/2.0/repositories/MyCompany/myrepo/downloads/path/to/your/file.txt
(下载"用于下载整个回购文件,例如.zip文件)
("Downloads" is to download entire repo files like a .zip file)
相反,您想做:
curl --user myuser@mydomain.com:password "https://api.bitbucket.org/2.0/repositories/MyCompany/myrepo/src/master/path/to/file.txt"
如果您尝试使用Invoke-RestRequest(在Powershell中),请注意还有一些额外的步骤.使用旧的1.0 API,您可以执行以下操作:
If you're trying to use Invoke-RestRequest (in powershell) note there are some extra steps. With the old 1.0 API you could do:
$cred = Get-Credential
$uri = "https://api.bitbucket.org/1.0/repositories/MyCompany/$($filepath)"
# Get the files from bitbucket (GIT)
Invoke-RestMethod -Credential $cred -Uri $uri -Proxy $proxyUri -OutFile $destination
使用不再可用的新2.0 API.Powershell的Invoke-RestMethod在发送凭据之前会等待401响应,而新的2.0 bitbucket api从不提供凭据,因此凭据也永远不会发送,从而导致403被禁止.
With the new 2.0 API that no longer works. Powershell's Invoke-RestMethod waits for a 401 response before sending the credentials, and the new 2.0 bitbucket api never provides one, so credentials never get sent causing a 403 forbidden.
要解决此问题,您必须使用以下丑陋的方法来强制Invoke-RestMethod立即在Authorization标头中发送凭据:
To work around that you have to use the following ugly hack to force Invoke-RestMethod to send the credentials immediately in an Authorization header:
$cred = Get-Credential
$uri = "https://api.bitbucket.org/2.0/repositories/MyCompany/$($filepath)"
$username = ($cred.GetNetworkCredential()).username
$password = ($cred.GetNetworkCredential()).password
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))
# Get the files from bitbucket (GIT)
Invoke-RestMethod -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Uri $uri -Proxy $proxyUri -OutFile $destination
希望这对将来有帮助的人有帮助!
Hopefully that helps someone else out in the future!
感谢@Jim Redmond的帮助.
Thanks @Jim Redmond for the help.