PowerShell ISE throws an error on git checkout

◇◆丶佛笑我妖孽 提交于 2019-11-28 00:53:58

There are few ways you can avoid these errors, none of them looks or feels 'natural'. First one uses error stream redirection and some logic around errors:

$out = git ? 2>&1
if ($?) {
    $out
} else {
    $out.Exception
}

Second depends on the ErrorAction, that is available only for PowerShell constructs, so we need to build one first:

& {
    [CmdletBinding()]
    param()

    git ?
} -ErrorAction SilentlyContinue -ErrorVariable fail

if ($fail) {
    $fail.Exception
}

In my ISEGit module I use latter to avoid error records 'leaking' to end user in uncontrolled manner.

Finally you can 'fix it' (well, sort off...) by making sure you can a string in the end:

"$(git ? 2>&1 )"

Or something I would vote against as it will leave you unaware of any actual errors, setting global $ErrorActionPreference to SilentlyContinue - though this is not different from redirecting error stream to $null.

Ali Ben Zarrouk

As specified here, adding -q after the command for quietness won't show these kind of errors.

Nathan Hartley

A profile ready Function-ized version of @BartekB's excellent answer...

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

It looks like you can now redirect stderr to stdout throughout your powershell script by simply setting an environment variable:

$env:GIT_REDIRECT_STDERR = '2>&1'
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!