2012-10-05 4 views
8

Kiedy wykonuję polecenia Git w PowerShell, wszystko działa dobrze, z wyjątkiem jednej niewielkiej różnicy między konsolą PowerShell i konsolą NuGet. Dane wyjściowe z "git push" są wyświetlane w czerwonym tekście błędu w oknie NuGet, ale są wyświetlane poprawnie w oknie PowerShell.PowerShell wyświetla niektóre wyniki polecenia git jako błąd w konsoli, mimo że operacja się powiodła

Oto film pokazujący różnicę. "git push" wyświetla wyniki w postaci błędu w konsoli menedżera pakietów. Operacja zadziałała, po prostu denerwuje to, że wynik działania jest wyświetlany jako błąd.

See the video

+0

Dzięki za bardzo trafną edycję, Microsoft. – Chev

Odpowiedz

1

Aby rozwiązać ten problem i nadal pracować z PowerShell ISE możesz utworzyć plik cmd o następującej treści:

@echo off 
git.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 2>&1 

i zarejestrować go jako alias (wewnątrz profilu):

Set-Alias git "git.cmd" 
21

głównej przyczyny: git push wysyła wyjście stderr, nie stdout. Zobacz here, here.

Powershell.exe jako host nie martwi się, gdy rodzime narzędzia wysyłają dane wyjściowe na stderr, ponieważ jest to dość popularny sposób drukowania nie tylko komunikatów o błędach, ale także komunikatów o stanie i innych rzeczy. Na przykład, spróbuj uruchomić coś zupełnie fałszywe jak

PS C:\> $result = findstr.exe q w e r t y 

findstr wysyłające komunikaty o błędach na stderr, więc powershell.exe nie wie przypisać tę „error” wyjście do zmiennej, ale to też nie freak out.

Z drugiej strony host menedżera pakietów NuGet nie jest tak inteligentny pod tym względem. Podczas uruchamiania dowolnego narzędzia natywnego host interpretuje wszystko w stderr jako prawdziwy błąd. W ten sposób otrzymasz czerwony tekst, komunikaty diagnostyczne itp. Spróbuj tego samego przykładu findstr powyżej w PM, zobaczysz pełne błędy.

Kilka Obejścia/sugestie:

  • Użyj parametru --porcelain, co powoduje wyjście, aby przejść do stdout, not stderr.
  • Set $errorView = 'CategoryView' które przynajmniej zminimalizować komunikaty o błędach, ale nie usunąć je
  • przekierować stderr i zrobić zwykły zapis konsoli tak: git push 2>&1 | write-host
+1

Łącze dla "stdout, not stderr." wydaje się "zepsuty". W systemie Windows '--porcelain' jest nieznaną opcją. Ale podłączenie wyjścia do Write-Host działa! Dziękuję Ci! :) –

+0

'--porcelain' również wydaje się być dla mnie nieznaną opcją także w wersji git 2.12.0.windows.1 :( – Luke