Pitmaster
PHPで使える Git:リポジトリの読み書き、diff、マージ、スマートHTTP通信を、git の外部実行なしで行えます。
composer require pitmaster/pitmaster最新リリース v0.2.11 MIT PHP 8.2+
# List all branches (current marked with *)
./bin/pitmaster branch
# Create a new branch from HEAD
./bin/pitmaster branch feature/new-thing
# Delete a branch
./bin/pitmaster branch -d feature/old
./bin/pitmaster branch -D feature/old実践例
リポジトリを開き、メソッド呼び出しまたはシェルから読み書きできます。
PHPからリポジトリを読み込む
Pitmaster::open()は.gitディレクトリを検出し、リポジトリハンドルを返します。各ステータス項目には、インデックスと作業ツリーそれぞれの状態が記録されます。
シェルからは./vendor/bin/pitmasterが git コマンドの一部を再現します。0.2.11以降は Composer のインストールから実行できます。
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";
}./vendor/bin/pitmaster log
./vendor/bin/pitmaster status
./vendor/bin/pitmaster diff
./vendor/bin/pitmaster show HEAD
./vendor/bin/pitmaster add file.txt
./vendor/bin/pitmaster commit -m "message"
./vendor/bin/pitmaster branch feature
./vendor/bin/pitmaster checkout feature
./vendor/bin/pitmaster merge featuregit バイナリ不要
コア操作は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のドキュメントから、簡潔に回答します。
いいえ。コアのリポジトリ操作に git バイナリや FFI は使いません。オブジェクト、参照、パックファイル、インデックス、スマートHTTPはPHP内で処理されます。
はい。リポジトリを開く際にPitmaster::processFreeOptions()または['processes' => false]を渡してください。フック、clone、fetch、push、SSH によるプロセス通信が無効になりますが、ローカルの読み書きは引き続き利用できます。
はい。フックはデフォルトで有効になっており、proc_open()を通じて実行されます。['hooks' => false]をPitmaster::open()、Pitmaster::init()、またはPitmaster::clone()に渡すと、そのハンドルでは.git/hooks内のスクリプトが実行されません。
Pitmaster::clone()、fetch()、push()は、SSH URL には SSH、それ以外にはスマートHTTPを使います。スマートな通信に失敗した場合、clone と fetch は dumb HTTPにフォールバックします。SSH では、ロード済みの場合は ssh2 拡張機能を、それ以外の場合はシステムの ssh バイナリを使います。
はい。Pitmaster::init()の2番目の引数に'sha256'を渡すか、init --object-format=sha256 を実行してください。オブジェクトには64文字のハッシュが使われます。
いいえ。log、status、diff、commit、merge、blame、grep など、一部の git コマンドを再現します。clone、fetch、push はPHPAPIからのみ利用できます。
スタートガイドに沿ってPHPから最初のリポジトリを開き、続いて残りの機能はAPIとCLIのリファレンスを参照してください。