我在運行git gc
的所有回購站的crontab中有一個@daily
作業。 我正在嘗試爲作業設置日誌文件,但I/O重定向不會生成我正在查找的結果;我收到一個空白文件。嘗試重定向'git gc'輸出
我已經完成了所有通常的>
,2>&1
等沒有任何成功。
有人提到我,git gc
使用ncurses輸出過程直接向控制檯拋出輸出,因此繞過stdout/stderr(糾正我,如果我在這裏錯了)。
有人能指出我正確的方向嗎?
我在運行git gc
的所有回購站的crontab中有一個@daily
作業。 我正在嘗試爲作業設置日誌文件,但I/O重定向不會生成我正在查找的結果;我收到一個空白文件。嘗試重定向'git gc'輸出
我已經完成了所有通常的>
,2>&1
等沒有任何成功。
有人提到我,git gc
使用ncurses輸出過程直接向控制檯拋出輸出,因此繞過stdout/stderr(糾正我,如果我在這裏錯了)。
有人能指出我正確的方向嗎?
你可以試試這個:
script -q -c 'git gc' > log
還是這個(更可讀的輸出):
script -q -c 'git gc' | sed 's/\r.*//g' > log
它不使用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