我有一个PowerShell脚本从SFTP下载文件,然后尝试将它们提交给git,但是我在最后一步遇到了问题。
try
{
# Load WinSCP .NET assembly
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Sftp
HostName = "myhostname"
UserName = "myusername"
Password = "mypassword"
SshHostKeyFingerprint = "ssh-rsa 2048 myfingerprint"
#GiveUpSecurityAndAcceptAnySshHostKey = "true"
}
$session = New-Object WinSCP.Session
try
{
New-Item -ItemType directory -Path "C:\tempfolder"
# Connect
$session.Open($sessionOptions)
# Download files
$transferOptions = New-Object WinSCP.TransferOptions
$transferOptions.TransferMode = [WinSCP.TransferMode]::Binary
$transferResult =
$session.GetFiles("/BE_Test3rdPartyUpload2VSTS/Project1/upload/*", "c:\tempfolder\*", $False, $transferOptions)
# Throw on any error
$transferResult.Check()
# Print results
foreach ($transfer in $transferResult.Transfers)
{
Write-Host "Download of $($transfer.FileName) succeeded"
}
git config --global user.email "myusername"
git config --global user.name "myname"
git pull --rebase origin master
git push origin master
git add .
git commit -m "Add existing file"
git push origin "master"
}
finally
{
# Disconnect, clean up
$session.Dispose()
}
exit 0
}
catch [Exception]
{
Write-Host "Error: $($_.Exception.Message)"
exit 1
}
我遇到的错误是:
答案 0 :(得分:2)
要将更改推送到master
分支,您应该使用以下方面更改powershell脚本:
取消选择PowerShell任务的标准错误失败选项
由于大多数git命令显示非标准输出,因此您需要取消选择PowerShell任务的标准错误失败选项,否则PowerShell将失败。
git repo网址中的提供商凭据
将更改推送到远程仓库时,您需要提供凭据。您可以在git repo URL中使用PAT或备用凭据。 git repo URL的格式如下:
https://Personal%20Access%20Token:{PAT}@{account}.visualstudio.com/{project}/_git/{repo}
https://{AlternateUserName}:{AlternatePassword}@{account}.visualstudio.com/{project}/_git/{repo}
所以你应该按下命令:
git push https://Personal%20Access%20Token:{PAT}@{account}.visualstudio.com/{project}/_git/{repo} master
或
git push https://{AlternateUserName}:{AlternatePassword}@{account}.visualstudio.com/{project}/_git/{repo} master
结帐到构建分支
在构建源目录中,默认情况下git repo处于HEAD分离状态,因此您需要通过以下方式切换到构建分支:
git checkout $(Build.SourceBranchName)
删除不必要的命令
脚本中的两个命令下面似乎没有对本地master
分支和远程master
分支进行任何更改:
git pull --rebase origin master
git push origin master
因此,您可以在脚本中删除它们。
以下是更改后的PowerShell脚本的示例:
try
{
# Load WinSCP .NET assembly
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Sftp
HostName = "myhostname"
UserName = "myusername"
Password = "mypassword"
SshHostKeyFingerprint = "ssh-rsa 2048 myfingerprint"
#GiveUpSecurityAndAcceptAnySshHostKey = "true"
}
$session = New-Object WinSCP.Session
try
{
New-Item -ItemType directory -Path "C:\tempfolder"
# Connect
$session.Open($sessionOptions)
# Download files
$transferOptions = New-Object WinSCP.TransferOptions
$transferOptions.TransferMode = [WinSCP.TransferMode]::Binary
$transferResult =
$session.GetFiles("/BE_Test3rdPartyUpload2VSTS/Project1/upload/*", "c:\tempfolder\*", $False, $transferOptions)
# Throw on any error
$transferResult.Check()
# Print results
foreach ($transfer in $transferResult.Transfers)
{
Write-Host "Download of $($transfer.FileName) succeeded"
}
git config --global user.email "myusername"
git config --global user.name "myname"
git checkout $(Build.SourceBranchName)
git add .
git commit -m "Add existing file"
git push https://Personal%20Access%20Token:tp3iai4yextum26xa6k6qbflhjrvpt4jcaak8fkhbhlpis7zkndq@marinaliu.visualstudio.com/Git2/_git/product1 master
}
finally
{
# Disconnect, clean up
$session.Dispose()
}
exit 0
}
catch [Exception]
{
Write-Host "Error: $($_.Exception.Message)"
exit 1
}