2013-08-01 72 views
7

我在運行git gc的所有回購站的crontab中有一個@daily作業。 我正在嘗試爲作業設置日誌文件,但I/O重定向不會生成我正在查找的結果;我收到一個空白文件。嘗試重定向'git gc'輸出

我已經完成了所有通常的>,2>&1等沒有任何成功。

有人提到我,git gc使用ncurses輸出過程直接向控制檯拋出輸出,因此繞過stdout/stderr(糾正我,如果我在這裏錯了)。

有人能指出我正確的方向嗎?

回答

6

你可以試試這個:

script -q -c 'git gc' > log

還是這個(更可讀的輸出):

script -q -c 'git gc' | sed 's/\r.*//g' > log

12

它不使用ncurses的(使用ncurses的典型接管程序整個屏幕)。

運行

strace -p -o git-gc.strace git gc 

顯示,進度消息寫入stderr(文件描述符2) - 但他們禁用如果標準錯誤是不是tty。所以,如果你運行

git gc 2>some_file 

然後some_file將是空的,因爲git gc完全不生產進度消息。

查看源代碼(builtin/gc.c),還有那個年代由--quiet命令行選項設置quiet選項:

git gc --quiet 

我還沒有發現的代碼上變成quiet如果標準錯誤不是tty,但我看到別處在GIT源類似的代碼,如:

quiet = !isatty(2); 

沒有命令行選項打開quiet選項off

這意味着如果要捕獲git gc的進度輸出,則需要說服它將stderr指向tty。

some guy's answer提供了一種方法來做到這一點。

但是,由於代碼只有在寫入終端時纔會生成進度消息,您可能會考慮是否真的需要捕獲這些消息。它們不是爲了保存而設計的,它們可能不是那麼有用。

如果你想自己檢查git的來源(如果你足夠的動力,破解他們逼進度消息寫入):

git clone git://git.kernel.org/pub/scm/git/git.git