Pitmaster
Git in PHP: Repositories lesen und schreiben, diffen, mergen und über smartes HTTP kommunizieren, ohne git als externen Prozess aufzurufen.
composer require pitmaster/pitmasterNeueste Version 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/oldIn der Praxis
Öffne ein Repository und lies oder bearbeite es anschließend mit Methodenaufrufen oder über die Shell.
Repository aus PHP lesen
Pitmaster::open() findet das Verzeichnis .git und gibt ein Repository-Handle zurück. Jeder Statuseintrag enthält einen eigenen Status für den Index und das Arbeitsverzeichnis.
Über die Shell bildet ./vendor/bin/pitmaster einen Teil der git-Befehle nach und funktioniert seit 0.2.11 auch mit einer Composer-Installation.
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 featureKein git-Binärprogramm
Kernfunktionen laufen in PHP 8.2+ ohne git-Binärprogramm oder FFI. Hooks und der SSH-Fallback starten Prozesse, sofern du nicht ['hooks' => false] oder processFreeOptions() übergibst.
Lesen und Schreiben
Loose-Objekte, Pack-Dateien mit Delta-Auflösung, der Index, Refs und Konfiguration. git kann lesen, was Pitmaster für Indexversionen 2 und 3 sowie Loose-Refs schreibt.
Diff und Merge
Myers-, Patience- und Histogramm-Diffs mit Umbenennungserkennung. Drei-Wege-Merge mit Konfliktmarkierungen.
Netzwerkprotokoll
Klonen, Abrufen und Pushen über smartes HTTP oder SSH, mit einem dummen HTTP-Fallback für Klonen und Abrufen. Protokoll v2 ist über die Clients auf niedrigerer Ebene verfügbar.
Git-Operationen
Hinzufügen, committen, Status anzeigen, Änderungen vergleichen, zusammenführen, auschecken, zurücksetzen, zwischenspeichern, Cherry-pick, rückgängig machen, Rebase, Zeilenhistorie anzeigen, suchen.
CLI
22 Befehle im Stil von git, darunter init, log, status, diff, add, commit, branch, merge, stash, blame und grep. Clone, fetch und push sind nur über die Bibliothek verfügbar.
Mit Oracle getestet
761 Szenarien vergleichen Ergebnisse mit Ausgaben von echtem git und laufen in CI; 605 stammen aus den Testsuiten von git selbst, libgit2, go-git, isomorphic-git, dulwich und JGit.
Vollständige Suche
Blame, grep, bisect, notes und ein Pfadfilter für Logs, ohne git als externen Prozess aufzurufen.
Warum Pitmaster
Funktioniert ohne git-Installation
Commits, Diffs, Status und Verlauf werden in PHP berechnet. So können auch Container und Hosts ohne git-Binärprogramm mit Repositories arbeiten.
Handles ohne Prozesse
Pitmaster::processFreeOptions() deaktiviert Hooks, fsmonitor-Hooks, Klonen, Abrufen, Pushen und SSH-Prozesstransport. Lokales Lesen und Schreiben funktioniert weiterhin.
Mit git abgeglichen
Integrationstests laufen gegen das git-Binärprogramm. Laut Support-Matrix sind 146 von 146 Funktionen im Umfang innerhalb des angegebenen Paritätsumfangs durch das Oracle bestätigt.
SHA-1 und SHA-256
Erstelle ein SHA-256-Repository mit Pitmaster::init($path, 'sha256') oder init --object-format=sha256. Pack-Dateien lassen sich lesen und schreiben; Commit-Graph-, Multi-Pack-Index- und Reftable-Dateien lassen sich lesen.
Im Vergleich zu
Weitere Möglichkeiten, Git-Repositories aus PHP zu bearbeiten und zu sehen, worin sich Pitmaster unterscheidet.
| Werkzeug | Gut geeignet für | Unterschiede zu Pitmaster |
|---|---|---|
| git (Befehlszeile) | Gut geeignet fürDie Referenzimplementierung mit umfangreichen Befehlen für übergeordnete Operationen und vollständigen Zugriff auf interne Funktionen. | Unterschiede zu PitmasterPitmaster läuft innerhalb des PHP-Prozesses, und Kernoperationen rufen git nicht als externen Prozess auf. Das CLI bildet nur einen Teil der git-Befehle nach. |
| czproject/git-php | Gut geeignet fürEin kompaktes PHP-API für init, Klonen, Commits, Merges, Branches, Tags und Remotes. Es läuft mit PHP 8.0 oder höher und steuert den installierten git-Client. | Unterschiede zu PitmasterPitmaster benötigt für Kernoperationen keinen git-Client, da es Objekte, Pack-Dateien und den Index selbst liest und schreibt. Voraussetzung ist PHP 8.2 oder höher. |
| gitonomy/gitlib | Gut geeignet fürZugriff auf Repositories ab PHP 8.4, ohne etwas kompilieren zu müssen. Die Arbeit erfolgt über Shell-Aufrufe an git. | Unterschiede zu PitmasterPitmaster führt für Kernoperationen keine Shell-Aufrufe aus. Ein Handle ohne Prozesse deaktiviert Funktionen, die sonst einen Prozess starten würden. |
| libgit2 | Gut geeignet fürEine portable C-Implementierung der Git-Kernmethoden als verknüpfbare Bibliothek mit Bindings für Ruby, .NET, Python, Node.js, Rust und mehr. | Unterschiede zu PitmasterPitmaster ist reines PHP und wird mit Composer installiert, ohne kompilierte Bibliothek oder FFI. 63 Oracle-Szenarien stammen aus den Testressourcen von libgit2. |
Quellen, ausgewählt
Fragen und Antworten
Kurze Antworten aus der Pitmaster-Dokumentation.
Nein. Kernoperationen mit Repositories verwenden weder das git-Binärprogramm noch FFI. Objekte, Refs, Pack-Dateien, der Index und smartes HTTP werden in PHP verarbeitet.
Ja. Übergib beim Öffnen des Repositorys Pitmaster::processFreeOptions() oder ['processes' => false]. Dadurch werden Hooks, Klonen, Abrufen, Pushen und SSH-Prozesstransport deaktiviert, während lokales Lesen und Schreiben weiterhin möglich ist.
Ja, Hooks sind standardmäßig aktiviert und werden über proc_open() ausgeführt. Übergib ['hooks' => false] an Pitmaster::open(), Pitmaster::init() oder Pitmaster::clone(), um die Skripte in .git/hooks für dieses Handle zu überspringen.
Pitmaster::clone(), fetch() und push() verwenden SSH für SSH-URLs und ansonsten smartes HTTP. Klonen und Abrufen greifen auf dummes HTTP zurück, wenn der smarte Austausch fehlschlägt. SSH verwendet die ssh2-Erweiterung, falls sie geladen ist, andernfalls das ssh-Binärprogramm des Systems.
Ja. Übergib 'sha256' als zweites Argument an Pitmaster::init() oder führe init mit --object-format=sha256 aus. Objekte verwenden dann 64-stellige Hashes.
Nein. Es bildet einen Teil der git-Befehle nach, etwa log, status, diff, commit, merge, blame und grep. Klonen, Abrufen und Pushen sind nur über das PHP-API verfügbar.
Beginne mit der Schnellstartanleitung, um dein erstes Repository aus PHP zu öffnen. Verwende anschließend die Referenzen zu API und CLI.