8

我在所有存储库上@daily运行的 crontab 中有一份工作。git gc我正在尝试为作业设置日志文件,但 I/O 重定向不会产生我正在寻找的结果;我得到一个空白文件。

我已经完成了所有通常的操作>2>&1依此类推,没有任何成功。

有人向我提到git gc将 ncurses 用于其输出过程,该过程将输出直接发送到控制台,从而绕过 stdout/stderr(如果我在这里错了,请纠正我)。

有人能指出我正确的方向吗?

4

2 回答 2

14

它不使用 ncurses(使用 ncurses 的程序通常会占据整个屏幕)。

跑步

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

显示进度消息被写入 stderr(文件描述符 2)——但如果 stderr 不是 tty,它们将被禁用。所以如果你跑

git gc 2>some_file

thensome_file将是空的,因为git gc根本不会产生进度消息。

查看源代码 ( builtin/gc.c),有一个quiet--quiet命令行选项设置的选项:

git gc --quiet

如果 stderr 不是 tty,我还没有找到打开的代码quiet 但是我在 git 源代码的其他地方看到了类似的代码,例如:

quiet = !isatty(2);

没有命令行选项可以关闭quiet选项。

这意味着,如果您想捕获 的进度输出git gc,您需要说服它使用指向 tty 的 stderr 运行。

有些人的回答提供了一种方法来做到这一点。

但由于代码仅在写入终端时才会生成进度消息,因此您可能会考虑是否真的需要捕获这些消息。它们不是为保存而设计的,它们可能并不是那么有用。

如果您想自己检查 git 源(并且,如果您有足够的动力,请破解它们以强制写入进度消息):

git clone git://git.kernel.org/pub/scm/git/git.git
于 2013-08-02T00:41:06.387 回答
6

你可以试试这个:

script -q -c 'git gc' > log

或者这个(具有更可读的输出):

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

于 2013-08-01T20:48:46.423 回答