使用远程 powershell 执行 git 命令会导致 NativeCommmandError

使用远程 powershell 执行 git 命令会导致 NativeCommmandError

执行远程 PowerShell 脚本时出现错误。我在本地计算机上运行一个 PowerShell 脚本,该脚本使用Invoke-Command进入cd远程 Amazon Windows Server 实例上的目录,随后Invoke-Command执行驻留在该服务器实例上的脚本。服务器上的脚本正在尝试从 GitHub 克隆存储库。我可以在服务器脚本中成功执行“ls”甚至“git --version”等操作。但是git clonegit pull等导致以下错误:

克隆到“MyRepo”... + CategoryInfo:NotSpecified:(克隆到“MyRepo”...:String)[],RemoteException + FullyQualifiedErrorId:NativeCommandError

这是我第一次使用 PowerShell 或 Windows Server。有人能就这个问题提供一些指导吗?

客户端脚本:

$s = new-pssession -computername $server -credential $user
invoke-command -session $s -scriptblock { cd C:\Repos; ls } 
invoke-command -session $s -scriptblock { param ($repo, $branch) & '.\clone.ps1' -repository $repo -branch $branch} -ArgumentList $repository, $branch
exit-pssession

服务器脚本:

param([string]$repository = "repository", [string]$branch = "branch")
git --version
start-process -FilePath git -ArgumentList ("clone", "-b $branch    https://github.com/MyGithub/$repository.git") -Wait 

我已将服务器脚本更改为使用启动进程,它不再抛出异常。它创建新的存储库目录和 .git 目录,但不会写入 github 存储库中的任何文件。这似乎是权限问题。再次手动调用脚本(远程桌面进入亚马逊框并从 powershell 执行它)效果很好。

答案1

就 Powershell 而言,这是正确的行为。

stderr不幸的是(至少在我看来),即使没有任何错误,git 也会输出大量信息。例如git checkout -b somenewbranch,它会将修改的文件列表等内容输出到 stdout,但Switched to new branch somenewbranch将消息(我认为这是最相关的消息)输出到stderr

处理此问题的最常见方法之一是将stderr输出重定向到stdout,例如:

git rebase master 2>&1

对于我见过的大多数用例来说,这已经足够了。如果你想对文本输出本身进行一些操作,你需要做更多的事情,因为 Powershell 会将 stderr 来源行存储为 而不是RemoteException。以下是string一个简短的示例,说明如何处理需要将输出记录到控制台的内容:

$result  = Invoke-Expression "& git checkout -b somefeaturebranch 2>&1"

$output = ""
foreach($line in $result)
{
    $val = ""
    if($line.GetType().Name -eq "ErrorRecord")
    {        
        $val = $line.Exception.Message
    }else{
        $val = $line
    }   
    $output = "$output`r`n$val"
}

Write-Host $output

答案2

在本地使用 Powershell ISE 和 Git 时,我也看到了这个“错误”。这实际上不是一个错误;相反,Powershell ISE 错误地解释了 Git 的控制台输出。如果您尝试基于控制台的 Powershell,您应该注意到没有显示任何错误信息。这似乎只是 Powershell ISE 的一个特性(也可能是其他不能很好地处理控制台应用程序输出的 Powershell 主机的特性)。

答案3

您可能会遇到双跳问题,解释如下:http://blogs.msdn.com/b/clustering/archive/2009/06/25/9803001.aspx

相关内容