Root cause: git push
is sending output to stderr, not stdout. See here, here.
Powershell.exe as a host does not get worried when native tools send output to stderr, since this is a somewhat common way to print not just error messages but status messages and other stuff. For example, try running something totally bogus like
PS C:> $result = findstr.exe q w e r t y
Findstr is sending error messages to stderr, so Powershell.exe knows not to assign that "error" output to your variable, but it also doesn't freak out.
The NuGet package manager host, on the other hand, is not as smart in this regard. When running any native tool, this host interprets anything in stderr as being truly an error. Thus you get the red text, diagnostic messages, etc. Try the same findstr
example above in the PM, you will see full errors.
A couple of workarounds/suggestions:
- Use the
--porcelain
parameter, which causes output to go to stdout, not stderr.
- Set
$errorView = 'CategoryView'
which will at least minimize the error messages, though not remove them
- Redirect stderr and do a plain console write like this:
git push 2>&1 | write-host
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…