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

标签 visual-studio git powershell visual-studio-2012 nuget

当我在 PowerShell 中执行 Git 命令时,除了 PowerShell 控制台和 NuGet 控制台之间的一个细微差别外,一切都运行良好。 “git push”的输出在 NuGet 窗口中以红色错误文本显示,但在 PowerShell 窗口中显示正常。

这是一个显示差异的视频。 “git push”在包管理器控制台中将其结果显示为错误。操作成功了,操作的输出显示为错误,这很烦人。

See the video

最佳答案

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

当 native 工具将输出发送到 stderr 时,作为主机的 Powershell.exe 不会担心,因为这是一种比较常见的方式,不仅可以打印错误消息,还可以打印状态消息和其他内容。例如,尝试运行一些完全伪造的东西,比如

PS C:\> $result = findstr.exe q w e r t y

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

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

一些解决方法/建议:

  • 使用 --porcelain 参数,这会导致输出转到 stdout, not stderr .
  • 设置 $errorView = 'CategoryView' 这至少会最小化错误消息,但不会删除它们
  • 重定向 stderr 并像这样写一个普通的控制台:git push 2>&1 |写主机

关于visual-studio - 即使操作成功,PowerShell 也会在控制台中将一些 git 命令结果显示为错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12751261/

相关文章:

.net - 从 IntelliSense 中隐藏用户控件属性

c# - 从 VSTest.Console.exe 向单元测试传递参数或选项

git - 查找用于 merge 提交的 merge 策略?

c# - PowerShell 和服务器管理器模块的跨平台系统库引用

powershell - PowerShell尾文件,但忽略匹配模式的行

c# - Visual Studio 2012 "the project file has been moved, renamed, or is not on your computer"

.net - Visual Studio 不断向我的 csproj 添加属性。为什么?

git - 推送的 git 存储库在 gitk 上缺少分支和标签名称

git - 版本控制系统中的 RPM 规范文件

azure - 有没有办法在上次成功时回滚 DevOps 管道?