Я хотел записать вывод git clone
в файл, используя
git clone https://github.com/someRepository > git_clone.file
Но вместо этого я получаю вывод, отображаемый / обновляемый в терминале, как
Cloning to 'someRepository' ...
remote: Counting objects: 2618, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 2618 (delta 2), reused 12 (delta 1), pack-reused 2603
Received objects: 100% (2618/2618), 258.95 MiB | 4.39 MiB/s, Done.
Resolving Differences auf: 100% (1058/1058), Done.
Check Connectivity ... Done.
Но файл git_clone.file
генерируется, но остается пустым.
Моей первоначальной целью было обойти вывод git
в функцию (см. мой вопрос здесь ). Но теперь я понял, что git
, похоже, даже не производит вывод в stdout
на самом деле, но как-то иначе, поскольку в файл ничего не записано.
Как получить этот отображаемый вывод из git
, чтобы перенаправить его в файл / функцию?
РЕДАКТИРОВАТЬ
Предложенное перенаправление stderr
(и stdout
) не решило проблему.
git clone https://github.com/someRepository 2> git_clone.file
git clone https://github.com/someRepository &> git_clone.file
git clone https://github.com/someRepository > git_clone.file > 2>&1
все дали мне один и тот же результат: только строка
Cloning to 'someRepository' ...
появляется в git_clone.file
ОБЩАЯ ИНФОРМАЦИЯ
Зачем мне это нужно?
Как объяснено в , мой другой вопрос здесь Я написал пользовательский индикатор выполнения всегда внизу вывода моих сценариев. (Я использую его в multible-скриптах, но) Скрипт в этом случае переносит множество (до сих пор 107) репозиториев git из github на наш собственный Gitlab-Server и восстанавливает поддержку Git LFS, которая обычно теряется без это.
Так что я хотел бы видеть все выходные данные git, но также хотел бы, чтобы мой индикатор выполнения работал в нижней части вывода в терминале.
Спасибо за вашу помощь!
Я только что нашел решение:
(Благодаря ответу на десерт ])
git
по замыслу никогда не пишет в stdout
, но stderr
. Поэтому мне нужно было также перенаправить stderr
, чтобы получить вывод, используя
git clone XYZ &> git_clone.file
В любом случае этого было недостаточно, и я получил только «неинтересную» часть вывода в файл, но не строки прогресса, который я действительно хотел.
Повторно выполняя повторную попытку в man git-clone
Я понял, что существует опция
--progress
progress status is reported on the standard error stream by
default when it is attached to a terminal, unless -q is
specified. This flag forces progress status even if the standard
error stream is not directed to a terminal.
Хотя я думаю, что на самом деле она уже была подключена к терминалу, теперь это кажется наконец, заставьте git записать строки части прогресса, которые меня больше всего интересуют, в stderr
, чтобы я мог теперь получить их, используя
git clone --progress XYZ &> git_clone.file
git clone
использует stderr
для вывода, поэтому просто напишите , что , в файл:
git clone https://github.com/someRepository 2>git_clone.file
В качестве альтернативы вы можете перенаправить stdout
и stderr
- в этом нет необходимости, но таким образом вы гарантируете, что каждый вывод, созданный командой, перенаправляется:
git clone https://github.com/someRepository &>git_clone.file
В случае git clone
, очевидно, есть другой вывод, если вы перенаправите его, вся информация о ходе выполнения, проходящая через терминал, не будет включена в выходной файл. Это по своему замыслу и IIRC, вы не можете легко изменить это поведение напрямую, однако , , если вам нужен вывод в другом скрипте, вы можете очень хорошо направить его к нему, который работает просто отлично и дает вам весь вывод:
git clone https://github.com/someRepository | cat
Внутри вашего скрипта вы можете получить stdin
с помощью -
, например cat -
для печати с stdin
по stdout
- см. Здесь для получения дополнительной информации: Как написать сценарий, который принимает ввод из файла или из стандартного ввода? и Как читать из файла или STDIN в Баш? .