You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell脚本SFTP下载文件后提交Git遇src refspec master不匹配错误

解决Git推送错误:error: src refspec master does not match any

你在SFTP下载后执行Git操作时踩了几个典型的坑,我帮你拆解问题并给出修复方案:

问题根源

这个错误的核心是Git找不到可以推送到远程master分支的有效提交记录,结合你的脚本来看,主要有三个问题:

  1. Git命令顺序完全颠倒:你先执行了git push,这时候还没把下载的文件添加、提交到本地仓库,本地没有任何新的提交内容,自然没东西可推;
  2. 工作目录不匹配:脚本执行Git命令时,大概率不在C:\tempfolder目录下,导致git add .根本找不到你从SFTP下载的文件;
  3. 用户邮箱配置错误:git config --global user.email填的是用户名myusername,Git要求这里必须是有效的邮箱地址,否则提交可能失败(虽然这不是直接导致refspec错误的原因,但会引发后续问题)。

修复后的完整脚本(关键部分调整)

我把脚本里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 {
        # 创建目录(如果不存在的话,加上-Force避免重复创建报错)
        New-Item -ItemType directory -Path "C:\tempfolder" -Force

        # 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操作部分开始 --------------------------
        # 切换到下载文件的目录,确保Git命令在正确的仓库路径下
        Set-Location "C:\tempfolder"

        # 配置Git用户信息(建议只配置一次,不需要每次脚本都执行,可移到脚本外)
        git config --global user.email "your-real-email@example.com"
        git config --global user.name "myname"

        # 拉取远程最新代码,避免冲突
        git pull --rebase origin master

        # 检查下载的文件是否存在,避免白忙活
        $downloadedFiles = Get-ChildItem "C:\tempfolder" -File
        if ($downloadedFiles.Count -eq 0) {
            Write-Host "No files downloaded, skipping Git operations."
            continue
        }

        # 添加所有下载的文件到Git暂存区
        git add .

        # 检查是否有需要提交的内容
        $gitChanges = git status --porcelain
        if (-not $gitChanges) {
            Write-Host "No new changes to commit, skipping Git operations."
        } else {
            # 提交变更,如果是全新仓库,第一次提交用-m "Initial commit"
            git commit -m "Add files downloaded from SFTP server"
            
            # 推送到远程master分支
            git push origin master
        }
        # -------------------------- Git操作部分结束 --------------------------

    } finally {
        # Disconnect, clean up
        $session.Dispose()
    }

    exit 0
} catch [Exception] {
    Write-Host "Error: $($_.Exception.Message)"
    exit 1
}

关键调整点说明

  • 强制切换工作目录:用Set-Location确保Git命令在文件所在的仓库目录下,这是很多新手容易忽略的点;
  • 修正Git操作流程:正确的顺序是「拉取最新代码 → 添加文件 → 提交 → 推送」,完全颠倒顺序肯定会出错;
  • 增加文件存在校验:下载完成后先检查是否有文件,避免因为SFTP下载失败导致Git无内容可提交;
  • 修复邮箱配置:把user.email改成真实的邮箱地址,Git提交必须要有这个配置;
  • 空变更检查:用git status --porcelain判断是否有需要提交的内容,避免无意义的提交和推送操作。

如果你的Git仓库是全新的(还没有任何初始提交),第一次提交时请把git commit -m "Add files..."改成git commit -m "Initial commit",完成初始提交后再正常推送。

内容的提问来源于stack exchange,提问作者Luis Valencia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:33:28