nodeでgit使いたかったのでやってみました。
googleやnpmで"npm git"で検索してみましたが、コレといったデファクトっぽい物が出ず。ググラビリティ低めですね。
simple-git
なんだか使いやすそうだったのでsimple-gitを使ってみました。
使い方はその名の通りシンプルで、gitコマンドとほぼ一緒なので直観的◎。
例えば
require('simple-git')().clone('gitリポジトリのPath', '作業コピーのPath');
や
reuqire('simple-git')('作業コピーのpath').pull();
などなど
addしてcommitしてpushもできます。
require('simple-git')()
.add('addしたいfile')
.commit('コミットメッセージ')
.push(['-u', 'origin', 'master'], callback);
とっても使いやすいですね。
Promiseをつかい時はcallback処理内にてresolve()をcallすれば良いです。
ハマりポイント
作業コピーがすでにあった場合はpull
、なければclone
したい時、
次のような記述をしてハマりました。
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);
}
requireをファイル先頭でしてしまいたい派の私には辛い