Help us understand the problem. What is going on with this article?

nodeでgitを扱う

More than 3 years have passed since last update.

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をファイル先頭でしてしまいたい派の私には辛い

koooge
組み込みエンジニア -> インフラエンジニア -> バックエンドエンジニア twitter: @koooge
https://www.koooge.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away