我在crontab中有一个@daily
作业,它在所有repo上运行git gc
。我正在尝试为作业设置日志文件,但I/O重定向不会产生我想要的结果;我得到一个空白文件。
我做了所有常见的>
、2>&1
等等,都没有成功。
有人向我提到,git gc
的输出过程使用ncurses,它将输出直接抛出到控制台,从而绕过stdout/stderr(如果我错了,请纠正我)。
有人能给我指正确的方向吗?
它不使用ncurses(使用ncurse的程序通常占据整个屏幕)。
运行
strace -p -o git-gc.strace git gc
显示进度消息已写入stderr(文件描述符2),但如果stderr不是tty,则会禁用这些消息。所以如果你运行
git gc 2>some_file
则some_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
你可以试试这个:
script -q -c 'git gc' > log
或者这个(有更可读的输出):
script -q -c 'git gc' | sed 's/r.*//g' > log