Japanese

nodeでgitを使う

  • このエントリーをはてなブックマークに追加

こんばんは

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

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


simple-git なんだか使いやすそうだったのでsimple-git [https://www.npmjs.com/package/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); }