使用Node.js运行git shortlog时,执行命令没有返回任何内容

4

我正在尝试使用nodejs获取git仓库的git shortlog结果:

var exec = require('child_process').exec;
exec("cd /tmp/"+folder +" && git shortlog", {maxBuffer: 500*1024}, function(error, stdout, stderror){
    console.log(arguments);
});

我的回调函数从未被调用,程序似乎一直在处理某些东西。当我在提示符中启动此命令时,我会得到结果。尝试将结果重定向到文件会创建一个空文件:
"cd /tmp/"+folder +" && git shortlog > stats.txt"

但是如果我使用git log,我就可以得到结果。

你知道为什么我的回调函数永远不会被git shortlog调用吗?

编辑: 我使用spawn得到了相同的结果:

exec("cd /tmp/"+folder, function(err){
    if(err){
        throw err;
    }

    var shortlog = spawn('git', ['shortlog']);
    shortlog.stdout.on('data', function (data) {
        console.log('stdout: ' + data);
    });

    shortlog.stderr.on('data', function (data) {
        console.log('stderr: ' + data);
    });

    shortlog.on('close', function (code) {
        console.log('child process exited with code ' + code);
    });
});

编辑2: process.chdir() 不会改变任何东西:

process.chdir('/tmp/'+folder);
var shortlog = spawn('git', ['shortlog']);
shortlog.stdout.on('data', function (data) {
        console.log('stdout: ' + data);
});

你可以尝试将exec替换为spawn,看看哪些事件正在触发。 - generalhenry
谢谢,我已经尝试过了,但问题依旧。 - manuquentin
下一步尝试:使用process.chdir而不是exec "cd ...",请参考http://nodejs.org/api/process.html#process_process_chdir_directory。 - generalhenry
谢谢你的回答,但是我遇到了同样的问题。我已经编辑了我的帖子。 - manuquentin
2个回答

20

git shortlog认为它需要从标准输入读取内容,因此会导致无限等待。请尝试以下操作:

exec('git shortlog < /dev/tty', { cwd : "/tmp/" + folder }, function(err, stdout, stderr) {
  console.log(arguments);
});

2
对于Windows系统,请使用 CON 代替 /dev/tty - ankitjaininfo

3
由于@robertklep的答案是正确的,但恐怕不完整。在*nix系统上,您可以使用/dev/tty,但在Windows上,这将引发类似以下错误的错误:

系统找不到指定的路径。

要解决此问题,请在Windows上执行以下操作:
var exec = require('child_process').exec;
var tty = process.platform === 'win32' ? 'CON' : '/dev/tty';

exec('git shortlog < ' + tty, { cwd : '/tmp/' + folder }, function(error, stdout, stderr) {
  console.log(arguments);
});

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