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
).
.
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.
Т.