Lewati ke konten

Pendahuluan

Pitmaster adalah pustaka PHP murni yang membaca dan menulis repositori Git secara native. Operasi inti repositori tidak menjalankan biner git melalui shell atau menggunakan FFI. Model objek Git, format file pack, format indeks, dan transport HTTP pintar diimplementasikan dalam PHP.

Alasan keberadaan Pitmaster

Aplikasi PHP yang berinteraksi dengan repositori Git biasanya menjalankan biner git melalui shell. Cara ini berfungsi, tetapi membuat git harus terpasang, menimbulkan masalah keamanan terkait exec() dan proc_open(), serta mempersulit penerapan aplikasi di lingkungan terbatas (container tanpa git, shared hosting, fungsi serverless).

Pitmaster menghilangkan ketergantungan pada git untuk pekerjaan inti repositori. Aplikasi PHP Anda dapat membaca riwayat commit, membuat commit, menghitung diff, memeriksa status, dan melakukan push ke remote melalui HTTP pintar hanya dengan fungsi bawaan PHP. Hook dan transport SSH adalah pengecualian: keduanya memulai proses dan dapat dinonaktifkan per handle repositori (lihat Hook).

Fungsinya

  • Membaca dan menulis objek lepas (blob, tree, commit, tag)
  • Membaca file pack dan me-resolve rantai delta (OFS_DELTA dan REF_DELTA)
  • Menulis file pack untuk operasi jaringan
  • Membaca dan menulis area indeks/staging (format v2, v3, v4)
  • Membaca dan menulis refs (branch, tag, HEAD, packed-refs, Reftable)
  • Menghitung diff (algoritma Myers, Patience, Histogram, dan Minimal) dalam format terpadu git
  • Melakukan merge tiga arah dengan deteksi konflik
  • Menelusuri graf commit (log, ancestry, merge base)
  • Menggunakan protokol Git HTTP pintar (clone, fetch, push)
  • Mendukung worktree, submodule, stash, hook, dan Git LFS

Persyaratan

  • PHP 8.2 atau lebih baru
  • Ekstensi zlib (bawaan di hampir semua instalasi PHP)
  • Ekstensi json
  • Ekstensi mbstring (dideklarasikan di composer.json, sehingga Composer memerlukannya saat instalasi)
  • Ekstensi ctype (digunakan untuk memvalidasi hash objek; diaktifkan di sebagian besar build PHP, tetapi tidak dideklarasikan di composer.json)

Operasi inti repositori tidak memerlukan biner git. Fitur opsional mungkin memerlukan kemampuan runtime tambahan: eksekusi hook menggunakan proc_open(), dan transport SSH menggunakan ext-ssh2 saat dimuat, atau menjalankan biner sistem ssh melalui proc_open() jika tidak.

Contoh singkat

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";
}

// Create a commit
$repo->add('src/Feature.php');
$commitId = $repo->commit('Add new feature');

Mulai dengan Memulai, lalu gunakan API, CLI, dan Operasi untuk bagian lainnya. Pengujian menjelaskan cara Pitmaster diperiksa terhadap git.