Hoppa till innehåll

Introduktion

Pitmaster är ett rent PHP-bibliotek som läser och skriver Git-repon direkt. Centrala repooperationer anropar inte binärfilen git via skalet och använder inte FFI. Objektmodellen Git, pack-filformatet, indexformatet och smart HTTP-transporten är implementerade i PHP.

Varför Pitmaster finns

PHP-applikationer som arbetar med Git-repon anropar vanligtvis binärfilen git via skalet. Det fungerar, men skapar ett hårt beroende av att git är installerat, medför säkerhetsproblem kring exec() och proc_open() och gör applikationen svårare att driftsätta i begränsade miljöer (containrar utan git, delad hosting, serverlösa funktioner).

Pitmaster tar bort beroendet av git för centralt repoarbete. Din PHP-applikation kan läsa commit-historik, skapa commits, beräkna diffar, kontrollera status och skicka ändringar till fjärrservrar via smart HTTP med enbart de inbyggda funktionerna i PHP. Hooks och transporten SSH är undantagen: båda startar processer och kan stängas av per repo-handtag (se Hooks).

Vad det gör

  • Läser och skriver lösa objekt (blob, tree, commit, tag)
  • Läser pack-filer och löser deltakedjor (OFS_DELTA och REF_DELTA)
  • Skriver pack-filer för nätverksåtgärder
  • Läser och skriver indexet och stagingområdet (formaten v2, v3, v4)
  • Läser och skriver referenser (grenar, taggar, HEAD, packed-refs, reftable)
  • Beräknar diffar (algoritmerna Myers, Patience, Histogram och Minimal) i det enhetliga formatet för git
  • Utför trevägssammanslagningar med konfliktdetektering
  • Går igenom commit-grafer (logg, härkomst, merge-bas)
  • Använder smart Git-HTTP-protokoll (kloning, hämtning, push)
  • Har stöd för arbetsträd, undermoduler, stash, hooks och Git LFS

Vad det kräver

  • PHP 8.2 eller senare
  • Tillägget zlib (inbyggt i praktiskt taget alla PHP-installationer)
  • Tillägget json
  • Tillägget mbstring (deklarerat i composer.json, så Composer kräver det vid installationen)
  • Tillägget ctype (används för att validera objekthashar; aktiverat i de flesta PHP-byggen, men inte deklarerat i composer.json)

Centrala repooperationer kräver inte binärfilen git. Valfria funktioner kan behöva ytterligare körningsfunktioner: hook-körning använder proc_open(), och transporten SSH använder ext-ssh2 när det är laddat och startar annars systemets binärfil ssh via proc_open().

Snabbexempel

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

Börja med Kom igång och använd sedan API, CLI och Åtgärder för resten av funktionerna. Testning beskriver hur Pitmaster testas mot git.