错误:src refspec master与VSTS中的powershell不匹配

时间:2018-05-22 13:55:37

标签: git powershell azure-devops

我有一个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
}

我遇到的错误是:

enter image description here

1 个答案:

答案 0 :(得分:2)

要将更改推送到master分支,您应该使用以下方面更改powershell脚本:

  1. 取消选择PowerShell任务的标准错误失败选项

    由于大多数git命令显示非标准输出,因此您需要取消选择PowerShell任务的标准错误失败选项,否则PowerShell将失败。

    enter image description here

  2. 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
    
  3. 结帐到构建分支

    在构建源目录中,默认情况下git repo处于HEAD分离状态,因此您需要通过以下方式切换到构建分支:

    git checkout $(Build.SourceBranchName)
    
  4. 删除不必要的命令

    脚本中的两个命令下面似乎没有对本地master分支和远程master分支进行任何更改:

    git pull --rebase origin master
    git push origin master
    
  5. 因此,您可以在脚本中删除它们。

    以下是更改后的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
    }