试图重定向'git gc'输出

s k*_*s k 7 git bash io-redirection git-gc

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

我已经做了所有常规的事情>,2>&1等等没有任何成功.

有人提到我git gc使用ncurses的输出程序将输出直接抛出到控制台,从而绕过stdout/stderr(如果我错了,请纠正我).

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

Kei*_*son 14

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

运行

strace -p -o git-gc.strace git gc
Run Code Online (Sandbox Code Playgroud)

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

git gc 2>some_file
Run Code Online (Sandbox Code Playgroud)

然后some_file将是空的,因为git gc根本不会产生进度消息.

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

git gc --quiet
Run Code Online (Sandbox Code Playgroud)

我还没有发现,原来的代码quiet ,如果标准错误是不是tty,但我在其他地方看到的Git源类似的代码,如:

quiet = !isatty(2);
Run Code Online (Sandbox Code Playgroud)

没有命令行选项打开quiet选项关闭.

这意味着如果你想捕获进度输出git gc,你需要说服它运行stderr指向tty.

一些人的回答提供了一种方法.

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

如果你想自己检查git源(并且,如果你有足够的动力,那么攻击它们以强制写入进度消息):

git clone git://git.kernel.org/pub/scm/git/git.git
Run Code Online (Sandbox Code Playgroud)


Nik*_*pov 6

你可以试试这个:

script -q -c 'git gc' > log

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

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