2014-11-11 2 views
7

В PowerShell git checkout работает без какого-либо сообщения об ошибке. В ISE, пока работает git checkout, ISE выдает сообщение об ошибке.PowerShell ISE выдает сообщение об ошибке git checkout

> 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 показывает только то, что испытывает обычная оболочка. Этот ответ не объясняет, как успокоить это раздражающее поведение.

+1

Кажется, ise реагирует на вывод stderr, где powershell этого не делает, возможно, посмотрите ответы на этот вопрос: http://stackoverflow.com/questions/1394084/ignoring-an-errorlevel-0-in-windows -powershell Если вы не хотите, чтобы ошибка отображалась, вы можете перенаправить stderr на $ null, как этот '2> $ null' – Paul

+0

Должен/Может ли этот вопрос быть переписан, чтобы представить тот факт, что поскольку Git использует поток вывода ошибок для многих (а не только для проверки), он выглядит ужасно на любом хосте (а не только на ISE)? –

ответ

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.

+0

Любой шанс вы можете показать быстрый пример того, как вы могли бы назвать его в примере 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 
+0

Кроме того, я добавил 'Function git() {Invoke-Git @args}', поэтому я могу использовать 'git' в обычном режиме. – BrunoLM

+1

Невозможно переименовать функцию или ее псевдоним. Я добавлю строку псевдонима к сценарию. –

+0

Создание псевдонима для 'git.exe' вызывает бесконечный цикл (потому что на вашем' Invoke-Git' вы его используете). Слияние просто «git» в порядке и не вызывает проблем. – BrunoLM

0

Как указано here, добавление -q после команды для тишины не покажет такого рода ошибок.