Как получить 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?,

Другие вопросы по тегам