ワナビーエンジニアのブログ

なんでもいいから文化的な生活を送りたい

nodeでgitを使う

こんばんは

nodeでhubotライクな先輩謹製botに機能追加していて git使いたかったのでやってみました。

googleやnpmで"npm git"で検索してみましたが、コレといったデファクトっぽい物が出ず。ググラビリティ低めですね。


simple-git

なんだか使いやすそうだったのでsimple-gitを使ってみました。

使い方はその名の通りシンプルで、gitコマンドとほぼ一緒なので直観的◎。

例えば

require('simple-git')().clone('gitリポジトリのパス', '作業コピーのPath');

reuqire('simple-git')('作業コピーのpath');

などなど

addしてcommitしてpushもできます。

require('simple-git')()
  .add('addしたいfile')
  .commit('コミットメッセージ')
  .push(['-u', 'origin', 'master'], callback);

とっても使いやすいですね。

Promiseをつかい時はcallback処理内にてresolve()をcallすれば良いです。


ハマりポイント

requireをファイル先頭でしてしまいたい派の私は、次のような記述をしてハマりました。

NGコード
const repoPath = 'path/to/repo',
          localPath= 'path/to/localDir';
let simpleGit = require('simple-git')(localPath); // NG


if (/* 作業コピーが既にある */) {
  simpleGit.pull();
} else {
  simpleGit.clone(repoPath, localPath);
}

これはclone()前だとrequire()時にlocalPathが存在せず、ENOENT吐いて落ちます。

workaroundとして下記のように都度require()します

const repoPath = 'path/to/repo',
          localPath= 'path/to/localDir';

if (/* 作業コピーが既にある */) {
  require('simple-git')().pull();
} else {
  require('simple-git')().clone(repoPath, localPath);
}