PowerShell脚本SFTP下载文件后提交Git遇src refspec master不匹配错误
解决Git推送错误:error: src refspec master does not match any
你在SFTP下载后执行Git操作时踩了几个典型的坑,我帮你拆解问题并给出修复方案:
问题根源
这个错误的核心是Git找不到可以推送到远程master分支的有效提交记录,结合你的脚本来看,主要有三个问题:
- Git命令顺序完全颠倒:你先执行了
git push,这时候还没把下载的文件添加、提交到本地仓库,本地没有任何新的提交内容,自然没东西可推; - 工作目录不匹配:脚本执行Git命令时,大概率不在
C:\tempfolder目录下,导致git add .根本找不到你从SFTP下载的文件; - 用户邮箱配置错误:
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
相关产品推荐
相关产品推荐

