我在所有存储库上@daily
运行的 crontab 中有一份工作。git gc
我正在尝试为作业设置日志文件,但 I/O 重定向不会产生我正在寻找的结果;我得到一个空白文件。
我已经完成了所有通常的操作>
,2>&1
依此类推,没有任何成功。
有人向我提到git gc
将 ncurses 用于其输出过程,该过程将输出直接发送到控制台,从而绕过 stdout/stderr(如果我在这里错了,请纠正我)。
有人能指出我正确的方向吗?
我在所有存储库上@daily
运行的 crontab 中有一份工作。git gc
我正在尝试为作业设置日志文件,但 I/O 重定向不会产生我正在寻找的结果;我得到一个空白文件。
我已经完成了所有通常的操作>
,2>&1
依此类推,没有任何成功。
有人向我提到git gc
将 ncurses 用于其输出过程,该过程将输出直接发送到控制台,从而绕过 stdout/stderr(如果我在这里错了,请纠正我)。
有人能指出我正确的方向吗?
它不使用 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
你可以试试这个:
script -q -c 'git gc' > log
或者这个(具有更可读的输出):
script -q -c 'git gc' | sed 's/\r.*//g' > log