Git clone: ​​Перенаправить stderr в stdout, но записывать ошибки в stderr

git clone записывает свой вывод в stderr, как описано здесь. Я могу перенаправить это с помощью следующей команды:

git clone https://myrepo c:\repo 2>&1

Но это перенаправит весь вывод, включая ошибки, от stderr до stdout. Есть ли способ перенаправить сообщения о проделанной работе на stdout, но сообщения об ошибках все еще записаны на stderr.

Ответ 1

Я использую этот script для запуска команд git. Поскольку git будет записывать в stderr, даже если он будет успешным (например, вытягивать при синхронизации), это обрабатывает эти случаи и выписывает первую строку вывода, что обычно необходимо знать.

<#
.Synopsis
    Invoke git, handling its quirky stderr that isn't error

.Outputs
    Git messages, and lastly the exit code

.Example
    Invoke-Git push

.Example
    Invoke-Git "add ."
#>
function Invoke-Git
{
param(
[Parameter(Mandatory)]
[string] $Command )

    try {

        $exit = 0
        $path = [System.IO.Path]::GetTempFileName()

        Invoke-Expression "git $Command 2> $path"
        $exit = $LASTEXITCODE
        if ( $exit -gt 0 )
        {
            Write-Error (Get-Content $path).ToString()
        }
        else
        {
            Get-Content $path | Select-Object -First 1
        }
        $exit
    }
    catch
    {
        Write-Host "Error: $_`n$($_.ScriptStackTrace)"
    }
    finally
    {
        if ( Test-Path $path )
        {
            Remove-Item $path
        }
    }
}

Ответ 2

Обновление MingW предоставляет новый способ обработки перенаправления с помощью Git 2.15.x/2.16 (Q1 2018)

Смотрите коммит b2f5571, коммит 1a172e4, коммит 3f94442 (01 ноября 2017 г.) от Йоханнеса Шинделина (dscho).
.

(Merged by Junio C Hamano -- [TG41] -- in commit 421f21c, 09 Nov 2017)

mingw: добавить экспериментальную функцию для перенаправления стандартных дескрипторов
В частности, при вызове Git из приложений, таких как Visual Studio Team Explorer, важно, чтобы stdin/stdout/stderr были закрыты правильно.

Однако при порождении процессов в Windows эти дескрипторы должны быть помечены как наследуемые, если мы хотим их использовать, но этот флаг является глобальным флагом и вполне может использоваться другими порожденными процессами, которые затем не знают, как закрыть эти дескрипторы.
Давайте представим набор переменных среды (GIT_REDIRECT_STDIN и друзей), которые указывают пути к файлам или, что еще лучше, именованные каналы (которые похожи на сокеты Unix) и которые используются порожденным процессом Git.

Это помогает обойти вышеупомянутую проблему: эти именованные каналы будут открываться не наследуемым способом при запуске, и никакие дескрипторы не передаются (и, следовательно, ни один из порожденных дескрипторов не должен закрываться любым порожденным дочерним элементом).

Эта функция поставляется с Git для Windows (помечена как экспериментальная) начиная с версии v2.11.0 (2), поэтому за это время она прошла серьезное тестирование. Документация Git теперь включает в себя:

GIT_REDIRECT_STDIN:
GIT_REDIRECT_STDOUT:
GIT_REDIRECT_STDERR:

Только для Windows: позволяет перенаправлять стандартные дескрипторы ввода/вывода/ошибки на пути, указанные переменными среды. Это особенно полезно в многопоточных приложениях, где канонический способ передачи стандартных дескрипторов через CreateProcess() не является опцией, поскольку для этого необходимо, чтобы дескрипторы были помечены как наследуемые (и, следовательно, каждый порожденный процесс наследовал бы их, возможно, блокируя обычные операции Git).

Основным предполагаемым вариантом использования является использование именованных каналов для связи (например, \\.\pipe\my-git-stdin-123).

И добавляет:

mingw: опционально перенаправить stderr/stdout через тот же дескриптор

Запись "2>&1" в Powershell и в оболочках Unix подразумевает, что stderr перенаправляется на тот же дескриптор, в который уже записан stdout.

Давайте используем это специальное значение, чтобы разрешить тот же трюк с GIT_REDIRECT_STDERR и GIT_REDIRECT_STDOUT: если предыдущее значение 2>&1, тогда stderr будет просто записан в тот же дескриптор, что и stdout.

Функциональность была предложена Джеффом Хостеллером.

Пример использования: $env:GIT_REDIRECT_STDERR = '2>&1'

Ответ 3

Вы можете избавиться от stderr.

с помощью этой команды:

git clone https://myrepo c:\repo 2>$null

Таким образом, все stderr не будут отображаться.

Вы не можете отобразить прогресс и выбросить только ошибки. Если команда вышла из строя, все выходные данные stderr, если успешно stdout

Изменить: Похоже, что git вывод команды всегда будет stderr, даже если команда удалась только в Windows. Т.