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이 여전히 작동하기 때문에 이것은 큰 문제는 아닙니다. 그렇기 때문에 표준 PowerShell이 ​​도움이되지 않을 때 ISE가 불만을 제기하는 이유와 중요한 점은 어떻게 이러한 불편 함을 예방할 수 있는지 궁금합니다.

저는 Why is Powershell ISE showing errors that Powershell console does not show?을 보았습니다. ISE는 정상적인 쉘이 겪고있는 것을 단지 표시하고 있다고 설명합니다. 그 대답은 어떻게이 성가신 행동을 조용하게하는지 설명하지 않습니다.

+1

powershell이 ​​아닌 stderr 출력에 ise가 반응하는 것 같습니다. 아마도이 질문에 대한 답변을 살펴보십시오. http://stackoverflow.com/questions/1394084/ignoring-an-errorlevel-0-in-windows -powershell 에러가 나타나기를 원하지 않는다면 stderr를 $ null로 리디렉션 할 수 있습니다. '02> $ null' – Paul

+0

Should/Git이 에러 출력 스트림을 많이 사용하기 때문에이 질문을 다시 쓸 수 있습니까? (체크 아웃뿐만 아니라) 출력 결과를 보면, ISE뿐만 아니라 모든 호스트에서 끔찍한 것처럼 보입니까? –

답변

8

이러한 오류를 피할 수있는 방법은 거의 없으며 '자연'상태로 보이지 않거나 느껴질 수있는 방법은 거의 없습니다. 첫 번째 오류 스트림을 리디렉션 및 오류 주위에 약간의 논리를 사용

두 번째는 ErrorAction에 따라
$out = git ? 2>&1 
if ($?) { 
    $out 
} else { 
    $out.Exception 
} 

, 즉 단지 PowerShell을 구축 할 수 있습니다를, 그래서 우리는 첫 번째 구축해야합니다에서

& { 
    [CmdletBinding()] 
    param() 

    git ? 
} -ErrorAction SilentlyContinue -ErrorVariable fail 

if ($fail) { 
    $fail.Exception 
} 

을 내 ISEGit 모듈 나는 통제되지 않은 방식으로 최종 사용자에게 '누출'오류 기록을 피하기 위해 후자를 사용합니다. 마지막으로

당신이 결국 문자열 수 확인하여 (... 음, 일종의 해제) '고칠'수

"$(git ? 2>&1)" 

또는 뭔가 내가 당신이 인식하지 못하고 떠나으로 반대 투표를 할 실제 오류가 발생하여 $ErrorActionPreference에서 SilentlyContinue으로 설정 - 오류 스트림을 $null으로 리디렉션하는 것과 다르지 않지만 here를 지정된대로

+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

, 오류의 이러한 종류를 표시하지 않습니다 조용함에 대한 명령 후 -q를 추가.

관련 문제