Почему "git submodule add ..." пишет в stderr, а не в stdout?

Сообщение

Cloning into 'sub-mod'...
done.

после 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

Если я изменю перенаправление в последней команде на ... 2> /dev/nullничего не печатается.

1 ответ

Решение

Это не ограничивается подмодулями, как отмечено здесь:

О регистрации подмодуля будет сообщено в stderr, поскольку это согласуется с остальными отчетами о ходе выполнения в Git.

Это поможет нам в следующем патче, когда мы хотим использовать init_submodule функция в update_clone чей стандартный вывод будет передан в оболочку, которая считывает параметры из стандартного вывода очень специфическим способом.

Вы можете увидеть это также в этом недавнем патче:

Перенаправьте вывод stdout в stderr, так как это просто информационные сообщения, а не для использования машинами.

Мы хотим инициировать субмодули от помощника для submodule update в более позднем патче, и вывод stdout указанного помощника потребляется частями submodule update которые все еще написаны в оболочке.

Поэтому мы должны быть осторожны, какие сообщения находятся на стандартном выводе.

Другие вопросы по тегам