【问题标题】:How to capture full output of `git clone`?如何捕获“git clone”的完整输出?
【发布时间】:2016-10-06 18:01:34
【问题描述】:

当我像往常一样运行 git clone 时,我看到了这个:

$ git clone https://github.com/bensmithett/webpack-css-example
Cloning into 'webpack-css-example'...
remote: Counting objects: 179, done.
remote: Total 179 (delta 0), reused 0 (delta 0), pack-reused 179
Receiving objects: 100% (179/179), 24.07 KiB | 0 bytes/s, done.
Resolving deltas: 100% (79/79), done.
Checking connectivity... done

但是,当我尝试将其重定向到文件(或将其存储在 shell 变量中)时,我只看到:

Cloning into 'webpack-css-example'...

这是我尝试过的:

$ git clone https://github.com/bensmithett/webpack-css-example 2>&1 | tee out.log
$ cat out.log
Cloning into 'sample-data'...

我也在 Node.js 中尝试过,它做了同样的事情:

const fs = require('fs');
const child = spawn('git clone https://github.com/bensmithett/webpack-css-example');
child.stdout.on('data', function(data){
  console.log(String(data));
});
child.stderr.on('data', function(data){
  console.log(String(data));
});
// Cloning into 'webpack-css-example'...

为什么所有remote: 等内容都没有通过管道传输到标准输入/标准错误?有什么方法可以捕获输出吗?如果没有,是什么原因导致输出显示在终端中,但它没有通过 stdout 或 stderr 传递?

【问题讨论】:

    标签: git shell unix pipe


    【解决方案1】:

    默认情况下,仅当标准错误流被定向到终端时,Git 才会显示克隆进度。由于您将其重定向到管道,因此输出流不再附加到终端。所以为了捕获输出,你需要添加--progress参数来强制进度状态,例如

    git clone --progress https://github.com/foo/bar 2> out.log
    

    或者,为了将输出存储在 shell 变量中

    out=$(git clone --progress https://github.com/foo/bar 2>&1)
    

    见:man git-clone

    --progress

    默认情况下,连接到终端时会在标准错误流上报告进度状态,除非指定了-q。即使标准错误流未定向到终端,此标志也会强制执行进度状态。


    要以任何其他方式强制终端,您必须预加载一些库以强制 isatty() 始终返回 true(请参阅:man isatty)。这个函数被 git 跨 source code 使用。

    【讨论】:

    • 有没有办法“假装”它是一个正在运行命令的终端?这样,命令可以在不更改其参数的情况下运行。这就是我所希望的,git 只是一个例子。
    • @LancePollard,并非没有额外的工具,例如unbuffer
    • @CharlesDuffy 你是怎么做到的?
    • @LancePollard, ...此外,这些默认值的存在是有充分理由的。完整的终端输出具有颜色代码、光标定位指令等内容。您不希望机器解析日志中出现这些内容。通常,您也不希望它们出现在人类可读的日志中。
    • 伪终端 (ptys) 的存在使得某些程序(“控制程序”或“主控程序”)可以运行其他程序(“受控程序”),使得受控程序相信 它与用户交互对话,而不是与控制程序对话。 script 命令使用 ptys,screentmux 等程序也使用 ptys,并且有一些库可以在用 C、Python 等编写的程序中使用 ptys。
    猜你喜欢
    • 2019-01-28
    • 1970-01-01
    • 2016-12-30
    • 2019-12-22
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 2012-11-22
    相关资源
    最近更新 更多