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)
你可以试试这个:
script -q -c 'git gc' > log
或者这个(输出更可读):
script -q -c 'git gc' | sed 's/\r.*//g' > log