web-dev-qa-db-ja.com

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の出力を関数にバイパスすることでした( 私の質問 を参照)。しかし、今では、gitstdoutへの出力を生成することすらしないように見えますが、ファイルに何も書き込まれないため、どういうわけか異なっています。

ファイル/関数にリダイレクトするために、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に表示されます


背景情報

なぜこれが必要なのですか?

他の質問はこちら で説明したように、スクリプトの出力の最後に常にカスタムプログレスバーを作成しました。 (マルチブルスクリプトで使用しますが) script は、この場合多くの(現在107まで)gitリポジトリをgithubから独自のGitlab-Serverに移行し、通常失われるGit LFSサポートを修復しますそれなしで。

したがって、gitのすべての出力を引き続き表示したいのですが、ターミナルの出力の下部で進行状況バーを機能させたいと思います。

2
derHugo

ご協力いただきありがとうございます!


私はちょうど解決策を見つけました:

パート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
5
derHugo

git cloneは出力にstderrを使用するため、ファイルにthatを書き込むだけです。

git clone https://github.com/someRepository 2>git_clone.file

または、stdoutstderrの両方をリダイレクトすることもできます。これは特に必要ありませんが、この方法では、コマンドによって生成されるevery出力がリダイレクトされることを確認します。

git clone https://github.com/someRepository &>git_clone.file

git cloneの場合、リダイレクトすると明らかに異なる出力があります。ターミナルで実行される進行情報全体は、出力ファイルに含まれません。これは設計上であり、IIRCはその動作を直接簡単に変更することはできません。しかし別のスクリプトで出力が必要な場合は、非常にうまくpipeそれはうまくいき、すべての出力が得られます:

git clone https://github.com/someRepository | cat

スクリプト内で、-stdinを取得できます。 cat -からstdinからstdout –詳細についてはこちらを参照してください。 ファイルまたはstdinからの入力を受け入れるスクリプトを記述する方法 および Bashのファイルまたはstdinから読み取る方法

1
dessert