【问题标题】:Trying to redirect 'git gc' output试图重定向“git gc”输出
【发布时间】:2013-08-02 21:06:31
【问题描述】:

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

我已经完成了所有通常的>2>&1 等等,但没有任何成功。

有人向我提到git gc 使用 ncurses 作为其输出过程,该过程直接将输出抛出到控制台,从而绕过 stdout/stderr(如果我在这里错了,请纠正我)。

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

【问题讨论】:

    标签: git bash io-redirection git-gc


    【解决方案1】:

    它不使用 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的代码,但是我在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
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      script -q -c 'git gc' > log

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

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

      【讨论】:

        猜你喜欢
        • 2017-06-14
        • 1970-01-01
        • 2018-12-03
        • 1970-01-01
        • 1970-01-01
        • 2010-12-17
        • 1970-01-01
        • 2011-06-04
        • 2014-03-28
        相关资源
        最近更新 更多