3.6 KiB
| title | tags | image | publish | |||
|---|---|---|---|---|---|---|
| git-jsを使ってみた備忘録 |
|
/uploads/ | public |
git-jsについて
git-js、パッケージ名はsimple-gitです。ここでは、simple-gitと呼びます。
正直公式のREADMEが充実してるので記事書くか迷った。
npmを使用して導入します。
npm i simple-git
このパッケージは、内部でgitコマンドを実行してそれをラッパーするライブラリです。 なので、実行環境に入っているgitを利用する必要があり、グローバルのconfigも影響します。
使ってみる
インスタンスの作成
simple-gitインスタンスを作成します。
インスタンスの引数に取るSimpleGitOptions には、gitリポジトリであるディレクトリや-cでしてされる引数を設定できます。
import { simpleGit, } from 'simple-git';
import type { SimpleGit, SimpleGitOptions } from 'simple-git';
const options: Partial<SimpleGitOptions> = {
baseDir: process.cwd(),
binary: 'git',
maxConcurrentProcesses: 6,
config: [
'http.proxy=someproxy'
],
};
const git: SimpleGit = simpleGit(gitOptions);
binaryはgitとして実行するバイナリのパス/コマンドmaxConcurrentProcessesは子プロセスの上限数- configは
git config http.proxy someproxy等と書いたときのconfig以降のオプション(キーと値を=で繋げて渡す)
認証情報の渡し方
そのアプリケーションでしか使わないデプロイキーをsshのコンフィグファイルから設定するなんて今日日流行りません。
gitインスタンス作成時に渡されるconfigは、コマンドでは
git -c "http.proxy=someproxy" clone ...
のように、-cによって渡されるやつです。
これを使って、git内部で実行されるsshを設定することができます。
core.sshCommand=ssh -i ./path/to/key -F /dev/null
詳しくはgit-ssh-configにまとめています。
コマンドを実行する
インタフェースに関数として多くのラップされたコマンドが存在します。 一覧はREADMEを参照してください。
git.pull();
git.clone(`https://github.com/....`);
git.init();
また、これらの関数をchainさせることができます。
await git.init().addRemote('origin', '...remote.git');
Wrapされていないコマンド
gitの新機能やニッチすぎるコマンドは関数として実装しきれていないようです。 その場合は、サブコマンドをテキストで受け取る関数に投げてやりましょう。 引用:Complex-Request
const commands = ['config', '--global', 'advice.pushNonFastForward', 'false'];
const result = await git.raw(...commands);
まとめ
もともとchild_processのexecSyncをつかってGitコマンドを実行していましたが、帰ってきたデータを解析する手間がかかるのでありがたくライブラリに頼りました。
似たようなライブラリに、js-gitというものがありますが、これはGitのラッパーではなく、gitをjsで実装することで、様々な環境でgitを弄れるというものらしいです。機会があったら触ってみたい。