在PowerShell中,git checkout
运行时没有任何错误消息。在ISE中,虽然git checkout
仍然有效,但ISE会给出错误消息。
> git checkout master
Your branch is ahead of 'origin/master' by 3 commits.
(use "git push" to publish your local commits)
git : Switched to branch 'master'
At line:1 char:1
+ git checkout master
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (Switched to branch 'master':String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
这不是主要问题,因为git checkout
仍然有效。但这很烦人,所以我想知道为什么ISE会在标准的PowerShell没有时抱怨,更重要的是,我们怎样才能防止这种烦恼。
我查看了Why is Powershell ISE showing errors that Powershell console does not show?,它解释了ISE只是显示正常shell正在经历的内容。答案并没有解释如何平息这种烦人的行为。
答案 0 :(得分:8)
有几种方法可以避免这些错误,其中没有一种看起来或感觉不自然。 第一个使用错误流重定向和一些错误的逻辑:
$out = git ? 2>&1
if ($?) {
$out
} else {
$out.Exception
}
第二个取决于ErrorAction,它仅适用于PowerShell结构,因此我们需要先构建一个:
& {
[CmdletBinding()]
param()
git ?
} -ErrorAction SilentlyContinue -ErrorVariable fail
if ($fail) {
$fail.Exception
}
在我的ISEGit模块中,我使用后者来避免错误记录和泄漏问题。以不受控制的方式结束用户。
最后你可以修复它' (好吧,排序......)确保你最后可以输入一个字符串:
"$(git ? 2>&1 )"
或者我会投反对票,因为它会让您不知道任何实际的错误,将全局$ErrorActionPreference
设置为SilentlyContinue
- 尽管这与重定向错误流没有区别到$null
。
答案 1 :(得分:5)
根据指定here,
在安静的命令之后添加-q
不会显示这些错误。
答案 2 :(得分:1)
简介准备好功能化版@ BartekB的优秀答案......
function Invoke-Git {
<#
.Synopsis
Wrapper function that deals with Powershell's peculiar error output when Git uses the error stream.
.Example
Invoke-Git ThrowError
$LASTEXITCODE
#>
[CmdletBinding()]
param(
[parameter(ValueFromRemainingArguments=$true)]
[string[]]$Arguments
)
& {
[CmdletBinding()]
param(
[parameter(ValueFromRemainingArguments=$true)]
[string[]]$InnerArgs
)
C:\Full\Path\To\git.exe $InnerArgs
} -ErrorAction SilentlyContinue -ErrorVariable fail @Arguments
if ($fail) {
$fail.Exception
}
}
# Could shorten the function name. I instead alias it, for terseness.
Set-Alias -Name git -Value Invoke-Git
# Also alias the name with the extension, as it is called by some applications this way.
Set-Alias -Name git.exe -Value Invoke-Git
答案 3 :(得分:0)
looks like现在,您只需设置环境变量即可在整个Powershell脚本中将stderr重定向到stdout:
$env:GIT_REDIRECT_STDERR = '2>&1'