为什么“git submodule add ...”写入stderr而不是stdout?

Ren*_*ger 6 git shell stdout stderr

消息

Cloning into 'sub-mod'...
done.
Run Code Online (Sandbox Code Playgroud)

git submodule add...将命令写入stderr后。我希望该消息被写入标准输出,因为我不认为它表明命令出了问题。

我可以使用以下命令序列重现此内容:

rm   -rf /tmp/repo /tmp/module
mkdir    /tmp/repo /tmp/module

cd /tmp/module

git init  > /dev/null
echo "foo" > foo;
git add foo > /dev/null
git commit . -m "+ foo" > /dev/null


cd /tmp/repo

git init > /dev/null
git submodule add /tmp/module/ sub-mod 1> /dev/null
Run Code Online (Sandbox Code Playgroud)

如果我将最后一个命令中的重定向更改为... 2> /dev/null,则不会打印任何内容。

Von*_*onC 6

这不限于子模块,如下所示

子模块的注册将报告给stderr,因为这与 Git 中的其余进度报告一致

当我们想要重用该 init_submodule函数时,这会在以后的补丁中帮助我们,其中的 stdout 将通过update_clone管道传输到 shell,shell 以非常特定的方式从 stdout 读取参数。

您也可以在最近的补丁中看到它:

将 stdout 的输出重新路由到stderr,因为它只是信息性消息,不会被机器消耗

我们希望submodule update 在以后的补丁中从帮助程序初始化子模块,并且所述帮助程序的标准输出输出由submodule update仍用 shell 编写的部分使用。

所以我们必须小心哪些消息在标准输出上。


在 Git 2.35(2022 年第一季度)中,编码指南文档已更新,以阐明我们系统中的标准错误。

请参阅Eric Sunshine ( )提交的 e258eb4(2021 年 12 月 2 日)。(由Junio C Hamano 合并 -- --提交212962d,2021 年 12 月 15 日)sunshineco
gitster

CodingGuidelines:输出到 stdout 与 stderr 的文档

签署人:Eric Sunshine
签署人:Jeff King

在这个项目中,长期以来一直在实践命令将其主要输出发送到 stdout,以便可以将其捕获到文件或通过管道发送,并向 stderr 发送“闲聊”消息(例如报告进度的消息),以便它们不会干扰主输出。
然而,这种做法并不一定是普遍的;另一种常见做法是仅将错误消息发送到 stderr,并将所有其他消息发送到 stdout。
因此,通过记录如何在此项目中使用 stdout 和 stderr 来帮助新手。

CodingGuidelines现在包含在其手册页中:

程序输出

我们区分 Git 命令的主要输出和仅仅是闲聊反馈的输出(例如,状态消息、运行记录或进度显示)以及错误消息。粗略地说,Git 命令的主要输出是人们可能想要捕获到文件或通过管道发送的输出;它的喋喋不休的输出不应干扰这些用例。

因此,主要输出应发送到标准输出流 (stdout),而杂乱输出应发送到标准错误流 (stderr)。产生主要输出的命令示例包括git loggit show、 和git branch --list在 stdout 流上生成输出。

并非所有 Git 命令都有主输出;对于主要功能是执行操作的命令来说通常是这样。有些动作命令是无声的,而另一些则是喋喋不休的。聊天操作命令的一个示例是git clone其发送到 stderr 流的“克隆到 ''...”和“检查连接...”状态消息。

来自 Git 命令的错误消息应始终发送到 stderr 流。