PowerShell ISE在git checkout上抛出错误

时间:2014-11-11 18:47:25

标签: git powershell powershell-v3.0 powershell-ise

在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正在经历的内容。答案并没有解释如何平息这种烦人的行为。

4 个答案:

答案 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'