如何捕获`git clone`的完整输出?

13

当我像往常一样运行 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:等内容都没有被输送到stdin/stderr?有没有办法捕获这些输出?如果没有,那么为什么输出会显示在终端上,但它却没有通过stdout或stderr传递?
为什么所有的remote:等内容都没有被输送到stdin/stderr?有没有办法捕获这些输出?如果没有,那么为什么输出会显示在终端上,但它却没有通过stdout或stderr传递?
1个回答

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

默认情况下,当标准错误流被重定向到终端时,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跨源代码使用。


有没有一种方法可以“假装”它是运行命令的终端?这样命令就可以在不改变其参数的情况下运行。这就是我所希望的,git只是一个例子。 - Lance
@LancePollard,如果没有额外的工具,比如unbuffer,是无法做到的。 - Charles Duffy
@CharlesDuffy 你是如何用那个实现的? - Lance
unbuffer git clone [...] - Charles Duffy
2
伪终端(ptys)存在是为了让某些程序(“控制程序”或“主程序”)可以运行其他程序(“被控制程序”),以便被控制的程序相信它正在与用户进行交互,而不是与控制程序进行交互。script命令使用ptys,像screentmux这样的程序也是如此,也有用于在C、Python等编程语言中使用ptys的库。 - torek
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接