为什么要输出;吉特日志;终端和node.js中的execSync不同

为什么要输出;吉特日志;终端和node.js中的execSync不同,node.js,git,Node.js,Git,我有一个新创建的存储库。当我执行命令时: git log——没有颜色——pretty=oneline 在终端,我得到: d4288625b31ad486941d6f4848054dcd96487687(主机->主机,原点/主机,原点/主机)初始提交 这是我们自然期望的 如果我在node.js中执行相同的命令: const{execSync}=require('child_process') const cmd=`git log--no color--pretty=oneline` const

我有一个新创建的存储库。当我执行命令时:

git log——没有颜色——pretty=oneline
在终端,我得到:

d4288625b31ad486941d6f4848054dcd96487687(主机->主机,原点/主机,原点/主机)初始提交
这是我们自然期望的

如果我在node.js中执行相同的命令:

const{execSync}=require('child_process')
const cmd=`git log--no color--pretty=oneline`
const commitlog=execSync(cmd,{encoding:'utf8'})
console.log(commitlog)
我得到:

d4288625b31ad486941d6f4848054dcd96487687初始提交
作为输出。正如您看到的,括号内的部分被截断


我也在一个成熟的存储库中对此进行了测试,但情况仍然相同,它与node.js中的maxBuffer设置无关。

来自
mangit log

--无装饰,--装饰[=short | full | auto | no]
[…]如果指定了auto,那么如果输出正在进行 对于终端,ref名称显示为short,否则不显示 将显示ref名称。默认选项是short


所以在您的案例中似乎设置了
--decoration=auto
?添加
--decoration=short
以获得确定性输出。

更一般地说,
git log
是git系统调用的命令。陶瓷命令根据用户配置设置和其他项目定制其输出,包括默认为
auto
log.decoration
。相比之下,Git有管道命令,这些命令可以从其他程序运行并产生一致的结果。不幸的是,没有与git log相当的管道系统-理想情况下,它会像git status一样,有一个选项,可以从程序中使用它,但是你只需要知道每个Git版本中所有可能的怪癖。添加
--decoration=short
解决了这个问题,但我真的不知道node.js脚本中的不同之处。无论如何,谢谢你。“我真的不知道node.js脚本中的不同之处是什么或如何。”当你通过
exec\u sync
在节点脚本中运行它时,进程的标准输出没有连接到终端。手册页上说,如果输出不发送到终端,则不显示任何引用名称。