【问题标题】:error: src refspec master does not match any with powershell from VSTS错误:src refspec master 与 VSTS 中的 powershell 不匹配
【发布时间】:2018-05-22 13:55:36
【问题描述】:

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

我的错误是这样的:

【问题讨论】:

  • 您的HEAD 已分离。您在哪里克隆或以其他方式初始化您尝试使用的存储库?您正在将文件下载到 C:\tempfolder,但我没有看到您对放置在那里的文件做任何事情,除非 C:\tempfolder 是您正在使用的 Git 存储库。

标签: git powershell azure-devops


【解决方案1】:

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

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

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

  2. git repo URL 中的提供者凭据

    将更改推送到远程仓库时,您需要提供提供者凭据。您可以在 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 detached中,所以需要通过以下方式切换到构建分支:

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

    脚本中的以下两个命令似乎对本地 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
}

【讨论】:

猜你喜欢
  • 2014-02-11
  • 2023-01-30
  • 2012-05-21
  • 2011-08-13
  • 2018-01-28
  • 2017-03-05
  • 2021-03-27
  • 2013-03-28
相关资源
最近更新 更多