Preskoči na vsebino

Uvod

Pitmaster je čista knjižnica PHP, ki izvorno bere in zapisuje repozitorije Git. Osnovna opravila v repozitoriju ne zaganjajo binarne datoteke git in ne uporabljajo FFI. Objektni model Git, oblika datotek paketa, oblika indeksa in pametni prenos HTTP so implementirani v PHP.

Zakaj obstaja Pitmaster

Aplikacije PHP, ki delujejo z repozitoriji Git, običajno zaženejo binarno datoteko git. To deluje, vendar ustvari močno odvisnost od nameščenega git, prinaša varnostna tveganja pri exec() in proc_open() ter otežuje uvajanje aplikacije v omejenih okoljih (v vsebnikih brez git, pri deljenem gostovanju in v funkcijah brez strežnika).

Pitmaster odpravi odvisnost od git pri osnovnem delu z repozitorijem. Vaša aplikacija PHP lahko bere zgodovino objav, ustvarja objave, izračunava razlike, preverja stanje in pošilja spremembe v oddaljene repozitorije prek pametnega protokola HTTP, pri čemer uporablja samo vgrajene funkcije PHP. Izjemi sta kavlji in prenos SSH: oba zaženeta procese in ju je mogoče izklopiti za posamezno povezavo z repozitorijem (glejte Kavlji).

Kaj omogoča

  • Bere in zapisuje ohlapne objekte (blob, tree, commit, tag)
  • Bere datoteke pack in razrešuje verige delta (OFS_DELTA in REF_DELTA)
  • Zapisuje datoteke pack za omrežne operacije
  • Bere in zapisuje indeks/območje za pripravo (formati v2, v3, v4)
  • Bere in zapisuje sklice (veje, oznake, HEAD, packed-refs, reftable)
  • Izračunava razlike (algoritmi Myers, Patience, Histogram in Minimal) v enotni obliki git
  • Izvaja tristranske združitve z zaznavanjem sporov
  • Spremlja grafe commitov (dnevnik, predniki, osnova združitve)
  • Uporablja pametni protokol Git HTTP (clone, fetch, push)
  • Podpira delovna drevesa, podmodule, stash, hooks in Git LFS

Kaj zahteva

  • PHP 8.2 ali novejši
  • Razširitev zlib (vgrajena v skoraj vse namestitve PHP)
  • Razširitev json
  • Razširitev mbstring (navedena v composer.json, zato jo Composer zahteva ob namestitvi)
  • Razširitev ctype (uporablja se za preverjanje zgoščenih vrednosti objektov; omogočena v večini gradenj PHP, vendar ni navedena v composer.json)

Osnovna opravila v repozitoriju ne zahtevajo binarne datoteke git. Izbirne funkcije lahko potrebujejo dodatne zmogljivosti izvajalnega okolja: izvajanje kavljev uporablja proc_open(), prenos SSH pa uporablja ext-ssh2, če je naložen, sicer pa zažene sistemsko binarno datoteko ssh prek proc_open().

Kratek primer

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');

Začnite z razdelkom Uvod, nato pa za preostale funkcije uporabite razdelke API, CLI in Opravila. Razdelek Testiranje pojasnjuje, kako se Pitmaster preverja glede na git.