使用Node.js获取当前的Git分支

14

如何在不使用外部库的情况下,用node.js获取当前的git分支?我需要获取当前分支名称以执行我节点文件中的另一个函数。

部分工作代码更新

我可以使用以下代码获取分支名称,但似乎无法记录消息,如果stdout匹配给定字符串。

const { exec } = require('child_process');
exec('git rev-parse --abbrev-ref HEAD', (err, stdout, stderr) => {
    if (stdout === 'name-of-branch') {
        console.log(this is the correct branch);
    }
});

4个回答

26

请尝试这些作品

const { exec } = require('child_process');
exec('git rev-parse --abbrev-ref HEAD', (err, stdout, stderr) => {
    if (err) {
        // handle your error
    }

    if (typeof stdout === 'string' && (stdout.trim() === 'master')) {
      console.log(`The branch is master`);
      // Call your function here conditionally as per branch
    }
});

接收输出为

$: node test.js 
The branch is master

但是如果“stdout”匹配一个字符串,你如何有条件地渲染console.log呢? - user3438917
更新了解决方案,这就是我认为你在谈论的内容。您可以有条件地检查分支名称并执行操作。 - Aayush Mall
如果问题得到解决,请将答案标记为已接受。错误的答案被标记为已接受@user3438917。 - Aayush Mall

14
这应该就可以了:
const { exec } = require('child_process');
exec('git branch --show-current', (err, stdout, stderr) => {
    if (err) {
        // handle your error
    }
});

stdout变量会包含您的分支名称。为使其正常工作,您需要安装git。


谢谢您的建议。我已经更新了我的代码以获取确切的分支,但似乎无法在stdout匹配字符串时记录一条消息。 - user3438917
1
@user3438917 你可能已经明白了,但是为了以后的参考,你需要在stdout上调用trim()才能做到这一点。 - Blackness

4

补充一下@Aayush Mall的答案,作为一个ES6模块,这样你就可以在项目的任何地方获取当前分支,并根据需要使用它。

import { exec } from 'child_process';

const getBranch = () => new Promise((resolve, reject) => {
    return exec('git rev-parse --abbrev-ref HEAD', (err, stdout, stderr) => {
        if (err)
            reject(`getBranch Error: ${err}`);
        else if (typeof stdout === 'string')
            resolve(stdout.trim());
    });
});

export { getBranch }


// --- --- Another File / Module --- ---

import { getBranch } from './moduleLocation.mjs'

const someAsyncFunction = async () => {
  console.log(await getBranch()); 
}

someAsyncFunction();

1
return语句可以被删除,因为它们在执行器中没有任何作用。 - slikts
我不完全同意。我认为作为JavaScript,理想情况下应该允许回调和返回,如果回调没有作为参数传递。讨论的焦点将放在是否使用返回值上,这样可以在项目的其他地方更灵活、多样化地使用该方法。 - Rafael Mori

0
如果,只是如果,你对项目的这个策略漠不关心的话,你可以在条件语句之前或之内,从字符串中去除外部空格(使用trim方法),并将其转换为大写或小写(使用toUpperCase或toLowerCase方法)。就像这样:
 const stA = ' oOo  ';
 const stB = 'OOO';
 if(stA.trim().toUpperCase() === stB.trim().toUpperCase()) {
    return true;
 } else {
    return false;
 }

或者你可以按照@jason-warner的建议去做。

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