git-promise, 运行任何git命令并使用承诺处理它的简单包装器

分享于 

7分钟阅读

GitHub

  繁體 雙語
Simple wrapper to run any git command and process it's output using promises.
  • 源代码名称:git-promise
  • 源代码网址:http://www.github.com/piuccio/git-promise
  • git-promise源代码文档
  • git-promise源代码下载
  • Git URL:
    git://www.github.com/piuccio/git-promise.git
    Git Clone代码到本地:
    git clone http://www.github.com/piuccio/git-promise
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/piuccio/git-promise
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    承诺

    允许你使用更直观的语法运行任何 git 命令的简单包装器。

    启动

    npm install git-promise --save

    安装后,你可以在你的JavaScript文件中使用它,如下所示:

    var git =require("git-promise");git("rev-parse --abbrev-ref HEAD").then(function (branch) {
     console.log(branch); // This is your current branch});

    模块将自动处理退出代码,因此

    var git =require("git-promise");git("merge origin/master").then(function () {
     // Everything was fine}).fail(function (err) {
     // Something went bad, maybe merge conflict?console.error(err);
    });

    err 是一个 Error 对象,使用 stdout 属性增强。 以下代码:

    git('clone http://example.org/notExistingExample.git').fail(function (err) {
     console.log("MESSAGE");
     console.log(err.message);
     console.log("STDOUT");
     console.log(err.stdout);
    });

    将记录:

    
    MESSAGE
    
    
    'git clone http://example.org/notExistingExample.git' exited with error code 128
    
    
    STDOUT
    
    
    Cloning into 'notExistingExample'...
    
    
    fatal: remote error: Repository does not exist
    
    
    The requested repository does not exist, or you do not have permission to
    
    
    access it.
    
    
    
    

    高级用法

    git 命令接受第二个参数,可以用于解析输出或者处理非 0退出代码。

    var git =require("git-promise");git("status -sb", function (stdout) {
     returnstdout.match(/## (.*)/)[1];
    }).then(function (branch) {
     console.log(branch); // This is your current branch});

    回调接受 2个参数 (stdout, code),其中 stdout 是git命令的输出,code 是退出代码。

    这里函数的返回值将是承诺的已经解析值。

    如果未指定 code 参数,将自动处理该参数,并在非 0代码的情况下拒绝承诺。

    var git =require("git-promise");git("merge-base --is-ancestor master HEAD", function (stdout, code) {
     if (code ===0) {
     // the branch we are on is fast forward to masterreturntrue;
     } elseif (code ===1) {
     // no, it's notreturnfalse;
     } else {
     // some other error happenedthrownewError("Something bad happened: "+ stdout);
     }
    }).then(function (isFastForward) {
     console.log(isFastForward);
    }).fail(function (err) {
     // deal with the error});

    链接命令

    想象一下,在本地分支上不能快速前进,你想知道在分叉点后将哪些提交推送到主机上:

    var git =require("git-promise");functionfindForkCommit () {
     returngit("merge-base master HEAD", function (output) {
     returnoutput.trim();
     });
    }functionfindChanges (forkCommit) {
     returngit("log "+ forkCommit +"..master --format=oneline", function (output) {
     returnoutput.trim().split("n");
     });
    }// synchronization can be done in many ways, for instance with QvarQ=require("q");
    [findForkCommit, findChanges].reduce(Q.when, Q({})).then(function (commits) {
     console.log(commits);
    });// or simply using promises, simple cases only?findForkCommit().then(findChanges).then(function (commits) {
     console.log(commits);
    });

    工作目录

    默认情况下,所有git命令都在当前工作目录中运行( 例如。 process.cwd() )。

    你可以使用以下语法在不同的文件夹中运行git命令

    var git =require("git-promise");git("blame file1.js", {cwd:"src/"}).then(function () {
     // Blame someone});

    自定义git可执行文件

    默认情况下,任何命令都尝试在 $PATH 中使用 git,如果你已经在中安装了 git,可以使用 gitExec

    var git =require("git-promise");git("status", {gitExec:"/usr/local/sbin/git"}).then(function () {
     // All good, I guess});

    命令行实用程序方法

    这个模块提供一些工具来解析一些git命令的输出

    var util =require("git-promise/util");
    • util.extractStatus(output [, lineSeparator])

    解析 git status --porcelain的输出,并返回一个

    
    {
    
    
     branch:"current branch name, only if git status -b is used",
    
    
     index: {
    
    
     modified: ["list of files modified in the index"],
    
    
     added: ["list of files added in the index"],
    
    
     deleted: ["list of files deleted in the index"],
    
    
     renamed: ["list of files renamed in the index"],
    
    
     copied: ["list of files copied in the index"]
    
    
     },
    
    
     workingTree: {
    
    
     modified: ["list of files modified in the local working tree"],
    
    
     added: ["list of files added/renamed/copied in the local working tree"],
    
    
     deleted: ["list of files deleted in the local working tree"]
    
    
     }
    
    
    }
    
    
    
    

    方法无论是否有选项 -z 都有效。

    • util.hasConflict(output)

    尝试确定 git merge-tree 输出中是否存在合并冲突

    var git =require("git-promise");var util =require("git-promise/util");git("merge-tree <root-commit> <branch1> <branch2>").then(function (stdout) {
     console.log(util.hasConflict(stdout));
    });

    发布历史

    • 0.3.1 修复当前工作目录当命令退出时不切换时出错
    • 0.3.0 自定义git可执行文件,带有 gitExec 选项
    • 0.2.0 更改当前工作目录
    • 0.1.0 刚开始

    COM  COMM  WRAP  换行  PROC  GIT  
    相关文章