Wprowadzenie
Pitmaster to czysta biblioteka PHP, która natywnie odczytuje i zapisuje repozytoria Git. Podstawowe operacje na repozytorium nie uruchamiają zewnętrznego pliku binarnego git ani nie korzystają z FFI. Model obiektów Git, format pliku pakietu, format indeksu oraz inteligentny transport HTTP są zaimplementowane w PHP.
Dlaczego istnieje Pitmaster
Aplikacje PHP współpracujące z repozytoriami Git zazwyczaj uruchamiają zewnętrzny plik binarny git. To działa, ale tworzy twardą zależność od zainstalowanego git, budzi obawy o bezpieczeństwo związane z exec() i proc_open() oraz utrudnia wdrażanie aplikacji w środowiskach o ograniczeniach (kontenery bez gita, hosting współdzielony, funkcje bezserwerowe).
Pitmaster eliminuje zależność od git przy podstawowych operacjach na repozytorium. Aplikacja PHP może odczytywać historię zatwierdzeń, tworzyć zatwierdzenia, obliczać różnice, sprawdzać stan i wysyłać zmiany do zdalnych repozytoriów przez inteligentny HTTP, korzystając wyłącznie z wbudowanych funkcji PHP. Wyjątki stanowią hooki i transport SSH: oba uruchamiają procesy i oba można wyłączyć dla danego uchwytu repozytorium (zob. Hooki).
Funkcje
- Odczytuje i zapisuje luźne obiekty (blob, tree, commit, tag)
- Odczytuje pliki pakietów i rozwiązuje łańcuchy delt (OFS_DELTA i REF_DELTA)
- Zapisuje pliki pakietów na potrzeby operacji sieciowych
- Odczytuje i zapisuje indeks/obszar przejściowy (formaty v2, v3, v4)
- Odczytuje i zapisuje referencje (gałęzie, tagi, HEAD, packed-refs, reftable)
- Oblicza różnice (algorytmy Myers, Patience, Histogram i Minimal) w ujednoliconym formacie gita
- Wykonuje scalanie trójstronne z wykrywaniem konfliktów
- Przechodzi przez grafy zatwierdzeń (log, pochodzenie, wspólna baza scalania)
- Obsługuje inteligentny protokół Git HTTP (clone, fetch, push)
- Obsługuje worktree, submoduły, stash, hooki i Git LFS
Wymagania
- PHP 8.2 lub nowszy
- Rozszerzenie
zlib(wbudowane w niemal wszystkie instalacje PHP) - Rozszerzenie
json - Rozszerzenie
mbstring(zadeklarowane wcomposer.json, więc Composer wymaga go podczas instalacji) - Rozszerzenie
ctype(używane do weryfikacji skrótów obiektów; włączone w większości kompilacji PHP, ale niezadeklarowane wcomposer.json)
Podstawowe operacje na repozytorium nie wymagają pliku binarnego git. Funkcje opcjonalne mogą wymagać dodatkowych możliwości środowiska uruchomieniowego: wykonywanie hooków korzysta z proc_open(), a transport SSH używa ext-ssh2, jeśli jest załadowane; w przeciwnym razie uruchamia systemowy plik binarny ssh za pośrednictwem proc_open().
Szybki przykład
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');
Zacznij od sekcji Pierwsze kroki, a następnie zapoznaj się z sekcjami API, CLI i Operacje, aby poznać pozostałe funkcje. Sekcja Testowanie wyjaśnia, jak Pitmaster jest sprawdzane względem git.