2017-01-25 22 views
0

一部のgitコマンドは、ioリダイレクトに関する注意です。たとえば、git bundleです。私は、これが基礎となる "配管"コマンドに関連していると考えています。 IO redirectionに関する素晴らしいチュートリアルがあり、同様の質問はgit commandsに関連しています。しかし、その解決策は動作しません。すべて gitコマンド。 git bundlegitコマンドがリダイレクトを尊重しない

例えば、

$ /usr/bin/git bundle create /tmp/backup.bundle --all >/tmp/backup.txt 2>&1 
$ ls -al /tmp 
-rw-rw-r-- 1 myuser mygroup 4329 Jan 25 10:46 backup.bundle 
-rw-rw-r-- 1 myuser mygroup  0 Jan 25 10:46 backup.txt 

ただし、コマンドラインから、私はいくつかの興味深い出力がある見ることができます:

$ /usr/bin/git bundle create /tmp/backup.bundle --all 
Counting objects: 6, done. 
Compressing objects: 100% (6/6), done. 
Writing objects: 100% (6/6), 4.11 KiB | 0 bytes/s, done. 
Total 6 (delta 0), reused 0 (delta 0) 

なぜ私はIOリダイレクションでこれをキャプチャすることはできませんか?アウトプットはどこに行くのですか?

+0

それで '/ usr/bin/git bundle create /tmp/backup.bundle --all> /tmp/backup.txt 2>&1'を実行するとどうなりますか?これはファイルへの書き込みではなく、 'stdout'への書き込みだけです。 – Inian

+0

申し訳ありませんが、typo - 'backup.txt'は空のファイルとして作成されます。 'stdout'や' stderr'には何も出力されていません@Inian –

答えて

2

これはどこにでもありますが、もっと正確には、Gitは最初にそれを印刷していません。

さまざまなGitコマンドには、-vまたは--verboseオプション、および-qまたは--quietオプションがあります。 Verboseは、オブジェクトを数えたり、圧縮したり、書き込んだりするようなことを印刷します。静かにすると、そのようなことは印刷されません。ただし、のデフォルトのは、ファイル記述子の結果をisatty()で調べ、その結果に基づいて冗長オプションを設定またはクリアすることです。

これは、出力をリダイレクトする(またはPython subprocessパイプからコマンドを使用する)場合、デフォルトで静かであるか、少なくとも非冗長であることを意味します。

あなたは時々、例えば、git fetch -vを明示的-vを追加することにより、冗長な出力をキャプチャすることができます(冗長オンよりも静かに。より多くのを抑制することができる)、それはへのオプションを渡すために失敗したgit fetchで少なくともマイナーなバグがありますいくつかのサブコマンドが実行されるので、これはすべてのケースではうまくいきません(私は数週間前に数時間を無駄にしました)。

git bundleコマンドに最初に-vオプションがないため、設定できません。 isatty()に "yes、this I/O device is tty"と表示されるように、コマンドをpty経由で実行することで冗長な出力を得ることができます。 sh moduleはこれを行うことができますが、私はそれを自分で使っていません。

+0

興味深いことに、 'git -v ...'は 'Unknown option:-v usage: git [--help] ... 'を実行し、' git --verbose ... 'を使うと、 'Unknownオプション:--verbose 用法:git [--version] [--help] ... '...私のコマンドライン' git -C "$ {dir}"バンドル "$ {dest}" --all'のために働く冗長なオプションは見つかりません。だから一貫性があり複雑で...おそらくそれはちょうど私のバージョン:gitバージョン2.1.0 –

+0

私の部分に悪い暗黙のビット: 'git -v'ではなく' git clone -v'、 'git fetch -v'、等々。 'git bundle'は' -v'を全く持たないようです。これが環境変数にコピーされたフロントエンドオプション(例えば '-C path'など)であればいいかもしれません。これは、実行した' git fetch -v'でバグを修正し、例えば。しかし、そうではありません。 – torek

0

git bundleは、その出力をstderrストリームに出力します。しかし、stderrストリームがTTYの場合にのみ、そうします。 e。基本的に対話型のコンソールです。そうではなく、パイプやファイルであれば、それを観察したときに何も印刷されません。

端末セッションまたはコマンドをファイルに記録するscriptユーティリティを使用すると、このチェックをすることができます。だからあなたの場合には

script --return --command '/usr/bin/git bundle create /tmp/backup.bundle --all' /tmp/backup.txt 

を行うと、そのファイル/tmp/backup.txtで出力を持つことになります。あなたがそれを見ると、なぜこの小切手もそこにあるのがわかります。 (スポイラー:これはあなたがTTYでこれを見ていない場合はもちろん、これは正常に動作しない、定期的に更新して上書きされる進捗情報である。)

免責事項:この答えは* nixシステムのために働きますWindows上のCygwinの場合も同様です。私はWindows用のプレーンなGitについて知らないのですが、scriptユーティリティはデフォルトでは利用できないかもしれませんし、Windowsポートまたは同等のものを検索したり、Cygwinを使ってこれを行う必要があります。

関連する問題