Как получить git, производящий вывод в файл?
Я хотел написать вывод 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
ИСХОДНАЯ ИНФОРМАЦИЯ
Зачем мне это нужно?
Как объяснено в моем другом вопросе здесь, я написал свой индикатор выполнения всегда внизу вывода моих сценариев. (Я использую его в многослойных скриптах, но) Скрипт в этом случае переносит множество (до сих пор 107) репозиториев git из github на наш собственный Gitlab-Server и восстанавливает поддержку Git LFS, которая обычно теряется без нее.
Поэтому я хотел бы видеть все выходные данные git, но также хотел бы, чтобы мой индикатор выполнения работал внизу вывода в терминале.
2 ответа
Спасибо за вашу помощь!
Я только что нашел решение:
Часть 1
(Благодаря ответу на десерт) git
по замыслу никогда не пишет stdout
но stderr
, Поэтому мне нужно было перенаправить stderr
Кроме того, чтобы получить вывод с помощью
git clone XYZ &> git_clone.file
Часть 2
В любом случае, этого было недостаточно, и я получил только "неинтересную" часть вывода в файл, но не те строки прогресса, которые мне действительно нужны.
Делаем еще раз заново в 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
- смотрите здесь больше: Как написать скрипт, который принимает входные данные из файла или из стандартного ввода? и как читать из файла или стандартного ввода в Bash?,