git - 尝试重定向 'git gc' 输出

标签 git bash io-redirection git-gc

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

相关文章:

git - 如何在不 fork 的情况下复制 gitlab/github 上的 git 存储库?

bash - 如何在等待网络服务器响应的 bash 中创建循环?

python - 从在 *nix 环境中调用的 python 脚本重定向 stdout 无法正常工作

windows - Windows 命令中的 "2>&1"有什么作用?

unix - 如何在gvim中查看某些数据而不先保存它?

git - 如何让 Git 在推送到远程存储库时只询问密码

ruby-on-rails - Heroku 应用程序似乎从错误的 Git 存储库/分支中提取

git - 如何列出所有 Git 子模块的 URL?

linux - 将输出重定向到文件 shell 脚本

bash - 使用 awk 获取第二列值之间的差异