尝试重定向'git gc'输出



我在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

相关内容

  • 没有找到相关文章

最新更新