blog-articles/article/tech/node-simple-git.md
2024-12-18 06:28:35 +09:00

3.6 KiB

title tags image publish
git-jsを使ってみた備忘録
NodeJS
Typescript
Git
/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_processexecSyncをつかってGitコマンドを実行していましたが、帰ってきたデータを解析する手間がかかるのでありがたくライブラリに頼りました。 似たようなライブラリに、js-gitというものがありますが、これはGitのラッパーではなく、gitをjsで実装することで、様々な環境でgitを弄れるというものらしいです。機会があったら触ってみたい。

参考文献