我在 crontab 中有一个 @daily
作业,它在所有 repos 上运行 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
然后 some_file
将是空的,因为 git gc
根本不会产生进度消息。
查看源代码 (builtin/gc.c
),有一个 quiet
选项,由 --quiet
命令设置-行选项:
git gc --quiet
如果 stderr 不是 tty,我还没有找到使 quiet
on 的代码,但我在 git 源代码的其他地方看到了类似的代码,例如:
quiet = !isatty(2);
没有命令行选项可以关闭 quiet
选项。
这意味着如果你想捕获 git gc
的进度输出,你需要让它相信它正在使用指向 tty 的 stderr 运行。
some guy's answer提供了一种方法。
但由于代码仅在写入终端时才会产生进度消息,因此您可能会考虑是否真的需要捕获这些消息。它们不是为了保存而设计的,它们可能没有那么有用。
如果你想自己检查 git 源(并且,如果你有足够的动力,破解它们以强制写入进度消息):
git clone git://git.kernel.org/pub/scm/git/git.git
关于git - 尝试重定向 'git gc' 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18002585/