即使操作成功,PowerShell也会在控制台中将某些git命令结果显示为错误

Che*_*hev 9 git powershell visual-studio nuget visual-studio-2012

当我在PowerShell中执行Git命令时,一切都很顺利,除了PowerShell控制台和NuGet控制台之间的一个细微差别." git push" 的输出显示在NuGet窗口中的红色错误文本中,但在PowerShell窗口中显示正常.

这是一段显示差异的视频." git push"在包管理器控制台中将其结果显示为错误.该操作有效,令人讨厌的是操作的输出显示为错误.

观看视频

lat*_*kin 25

根本原因:git push将输出发送到stderr,而不是stdout.见这里,这里.

当本机工具将输出发送到stderr时,Powershell.exe作为主机不会担心,因为这是打印错误消息但状态消息和其他内容的一种常见方式.例如,尝试运行完全虚假的东西

PS C:\> $result = findstr.exe q w e r t y
Run Code Online (Sandbox Code Playgroud)

Findstr正在向stderr发送错误消息,因此Powershell.exe知道不会将"错误"输出分配给您的变量,但它也不会吓坏.

另一方面,NuGet包管理器主机在这方面并不那么聪明.运行任何本机工具时,此主机会将stderr中的任何内容解释为真正的错误.因此,您将获得红色文本,诊断消息等.findstr在PM中尝试上面的相同示例,您将看到完整错误.

几个变通办法/建议:

  • 使用--porcelain参数,导致输出转到stdout,而不是stderr.
  • 设置$errorView = 'CategoryView'哪个将至少最小化错误消息,但不删除它们
  • 重定向stderr并执行一个普通的控制台写如下: git push 2>&1 | write-host

  • “标准输出,而不是标准错误”的链接。似乎“坏了”。对于 Windows,`--porcelain` 是一个未知选项。但是将输出通过管道传输到 Write-Host 是有效的!谢谢!:) (2认同)

Con*_*ole 4

要解决此问题并继续使用 Powershell ISE,您可以创建一个包含以下内容的 cmd 文件:

@echo off
git.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 2>&1
Run Code Online (Sandbox Code Playgroud)

并将其注册为别名(在您的个人资料中):

Set-Alias git "git.cmd"
Run Code Online (Sandbox Code Playgroud)