Gitを叩くGruntプラグインはいくつかあるけど、Grunt管理外のディレクトリにあるGitリポジトリでも気軽に叩けそうなのがなかった。大体GruntのルートとGitのルートが一致していることが想定されている。それでもGruntのルートが下流ならなんとかなるけど、逆の場合はどうにもならない。しょうがないのでファイルを指定してタスクを走らせたら、指定の作業フォルダへ移動してからそのファイルをaddしてcommitするだけのGruntタスクを書いて使うことにした。

Download: grunt-gitcommit.js

オプションはcwdmessageの2つ。cwdでコミットしたいGitリポジトリのルートを、messageでコミット・メッセージのプリフィックスを指定できる。

gitcommit: {
  options: {
    cwd: '../../weblog/',
  },
  publish: {
    options: {
      message: 'Publish'
    },
    src: [grunt.option('file')]
  },
  rebuild: {
    options: {
      message: 'Rebuild'
    },
    src: [grunt.option('file')]
  }
}
};

--fileオプションなどでコミットしたいファイルを指定してタスクを実行すれば良い。オプションの名前はタスク設定の書き方に依存するので何でも良い。この設定例でなんとなく想像がつくように、ウェブログの記事のGitリポジトリを叩くのに使っている。今までGitのフックでGrunt叩いてたけど逆の方が良さそうかな、とGitを使った静的ウェブサイトのデプロイを読んで影響されたので。

$ grunt gitcommit:publish --file=/path/to/foo/bar.txt

Nodeのpathモジュールを使って相対パスに変換するようになっているので、ファイルの指定は絶対パスでも相対パスでも大丈夫。