コンテンツへスキップ

Pitmaster

PHPで使える Git:リポジトリの読み書き、diff、マージ、スマートHTTP通信を、git の外部実行なしで行えます。

ターミナル
composer require pitmaster/pitmaster

最新リリース v0.2.11 MIT PHP 8.2+

実践例

リポジトリを開き、メソッド呼び出しまたはシェルから読み書きできます。

PHPからリポジトリを読み込む

Pitmaster::open()は.gitディレクトリを検出し、リポジトリハンドルを返します。各ステータス項目には、インデックスと作業ツリーそれぞれの状態が記録されます。

シェルからは./vendor/bin/pitmasterが git コマンドの一部を再現します。0.2.11以降は Composer のインストールから実行できます。

PHP
use Pitmaster\Pitmaster;

$repo = Pitmaster::open('/path/to/project');

// Read the current HEAD commit
$head = $repo->head();
echo $head->message;

// List branches
foreach ($repo->branches() as $branch) {
    echo $branch . "\n";
}

// Check status
foreach ($repo->status() as $entry) {
    echo "{$entry->path}: {$entry->index->value}{$entry->worktree->value}\n";
}

git バイナリ不要

コア操作はPHP8.2+で実行でき、git バイナリや FFI は不要です。ただしフックと SSH フォールバックはプロセスを起動します。['hooks' => false]またはprocessFreeOptions()を渡すと無効になります。

読み書き

ルーズオブジェクト、デルタ解決に対応したパックファイル、インデックス、参照、設定を扱います。git はインデックスのバージョン2と3、およびルーズ参照について、Pitmasterが書き込んだ内容を読み取れます。

Diff とマージ

名前変更検出に対応した Myers、patience、histogram diff。競合マーカー付きの三者間マージ。

ネットワークプロトコル

スマートHTTPまたは SSH 経由で clone、fetch、push を行い、clone と fetch では dumb HTTPにフォールバックできます。低レベルのクライアントではプロトコル v2 を利用できます。

Git 操作

add、commit、status、diff、merge、checkout、reset、stash、cherry-pick、revert、rebase、blame、grep。

CLI

init、log、status、diff、add、commit、branch、merge、stash、blame、grep など、git 形式のコマンドを22個利用できます。clone、fetch、push はライブラリからのみ利用できます。

オラクルテスト済み

761件のシナリオで、実際の git から取得した出力と結果を比較し、CI で実行します。そのうち605件は、git、libgit2、go-git、isomorphic-git、dulwich、JGit 自体のテストスイートから取り込んでいます。

包括的な検索

git を外部実行せずに、blame、grep、bisect、notes、ログのパスフィルターを利用できます。

Pitmasterを選ぶ理由

git をインストールせずに使える

コミット、diff、ステータス、履歴はPHP内で計算されるため、git バイナリのないコンテナやホストでもリポジトリを扱えます。

プロセスを起動しないハンドル

Pitmaster::processFreeOptions()は、フック、fsmonitor フック、clone、fetch、push、SSH によるプロセス通信を無効にします。ローカルの読み書きは引き続き利用できます。

git と照合済み

統合テストは git バイナリを使って実行されます。サポートマトリクスでは、対象範囲内の146機能すべてが、宣言された互換性の範囲内でオラクル検証済みです。

SHA-1とSHA-256

Pitmaster::init($path, 'sha256')を指定するか、init --object-format=sha256 を実行してSHA-256リポジトリを作成できます。パックファイルは読み書きでき、commit-graph、multi-pack index、reftable ファイルは読み取れます。

との比較

PHPから Git リポジトリを扱う他の方法と、Pitmasterとの違いを紹介します。

他のツールとPitmasterの比較
git(コマンドライン) 得意なこと高レベルの操作から内部機能への完全なアクセスまで、幅広いコマンドを備えたリファレンス実装です。 Pitmasterとの違いPitmasterはPHPプロセス内で動作し、コア操作で git を外部実行しません。CLIが再現する git コマンドは一部のみです。
czproject/git-php 得意なことinit、clone、commit、merge、ブランチ、タグ、リモートに対応したコンパクトなPHPAPIです。PHP8.0以降で動作し、インストール済みの git クライアントを操作します。 Pitmasterとの違いPitmasterはオブジェクト、パックファイル、インデックスを自ら読み書きするため、コア操作に git クライアントは不要です。PHP8.2以降が必要です。
gitonomy/gitlib 得意なことビルド不要でPHP8.4以降からリポジトリにアクセスできます。git をシェルから呼び出して動作します。 Pitmasterとの違いPitmasterはコア操作でシェルを呼び出しません。プロセスを起動しないハンドルを使うと、プロセスを起動する機能も無効になります。
libgit2 得意なことGit のコアメソッドを実装した、リンク可能なポータブル C ライブラリです。Ruby、.NET、Python、Node.js、Rust などのバインディングを備えています。 Pitmasterとの違いPitmasterは Composer でインストールする通常のPHPで、コンパイル済みライブラリや FFI は不要です。オラクルシナリオのうち63件を libgit2 のテストリソースから取り込んでいます。

質問と回答

Pitmasterのドキュメントから、簡潔に回答します。

スタートガイドに沿ってPHPから最初のリポジトリを開き、続いて残りの機能はAPIとCLIのリファレンスを参照してください。