Pitmaster
Git in PHP: repositories lezen en schrijven, diffen, mergen en slimme HTTP-protocollen gebruiken zonder git als subprocess te starten.
composer require pitmaster/pitmasterNieuwste release 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 de praktijk
Open een repository en lees en schrijf deze vervolgens met method calls of vanuit de shell.
Een repository lezen vanuit PHP
Pitmaster::open() vindt de map .git en retourneert een repositoryhandle. Elke statusvermelding bevat een afzonderlijke status voor de index en de working tree.
Vanaf de shell weerspiegelt ./vendor/bin/pitmaster een subset van git-opdrachten en werkt het met een Composer-installatie, omdat 0.2.11.
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 featureGeen git-binary
Kerntaken worden uitgevoerd in PHP 8.2+ zonder git-binary of FFI. Hooks en de SSH-fallback starten processen, tenzij je ['hooks' => false] of processFreeOptions() doorgeeft.
Lezen en schrijven
Loose objects, pack-bestanden met deltaresolutie, de index, refs en configuratie. git leest wat Pitmaster schrijft voor indexversies 2 en 3 en loose refs.
Diff en merge
Myers-, patience- en histogram-diffs met hernoemingsdetectie. Three-way merge met conflictmarkeringen.
Netwerkprotocol
Clone, fetch en push via smart HTTP of SSH, met een dumb HTTP-fallback voor clone en fetch. Protocol v2 is beschikbaar via de clients op lager niveau.
Git-bewerkingen
toevoegen, vastleggen, status, verschil, samenvoegen, uitchecken, resetten, opbergen, cherry-picken, terugdraaien, rebasen, schuld toewijzen, zoeken.
CLI
22 opdrachten in git-stijl, waaronder init, log, status, diff, add, commit, branch, merge, stash, blame en grep. Clone, fetch en push zijn alleen beschikbaar via de library.
Getest met oracle
761 scenario's vergelijken resultaten met uitvoer die is vastgelegd van echte git en worden uitgevoerd in CI; 605 zijn afkomstig uit de testsuites van git zelf, libgit2, go-git, isomorphic-git, dulwich en JGit.
Volledig zoeken
Blame, grep, bisect, notes en een logpadfilter, zonder git als subprocess te starten.
Waarom Pitmaster
Werkt zonder git-installatie
Commits, diffs, status en geschiedenis worden berekend in PHP, zodat containers en hosts zonder git-binary toch met repositories kunnen werken.
Handles zonder processen
Pitmaster::processFreeOptions() schakelt hooks, fsmonitor-hooks, clone, fetch, push en SSH-procest transport uit. Lokaal lezen en schrijven blijft werken.
Getoetst aan git
Integratietests worden uitgevoerd tegen de git-binary, en de supportmatrix telt 146 van de 146 functies binnen scope als geverifieerd met oracle binnen de gedeclareerde pariteitsscope.
SHA-1 en SHA-256
Maak een SHA-256-repository met Pitmaster::init($path, 'sha256') of init --object-format=sha256. Pack-bestanden worden gelezen en geschreven; commit-graph-, multi-pack-index- en reftable-bestanden kunnen worden gelezen.
Vergeleken met
Andere manieren om met Git-repositories te werken vanuit PHP, en de verschillen met Pitmaster.
| Tool | Goed in | Verschil met Pitmaster |
|---|---|---|
| git (opdrachtregel) | Goed inDe referentie-implementatie, met een uitgebreide set opdrachten voor zowel bewerkingen op hoog niveau als volledige toegang tot interne onderdelen. | Verschil met PitmasterPitmaster draait binnen het PHP-proces en kerntaken starten git niet als subprocess. De CLI weerspiegelt slechts een subset van de git-opdrachten. |
| czproject/git-php | Goed inEen compacte PHP API voor init, clone, commit, merge, branches, tags en remotes. Werkt met PHP 8.0 of hoger en gebruikt de geïnstalleerde git-client. | Verschil met PitmasterPitmaster heeft voor kerntaken geen git-client nodig, omdat het zelf objecten, pack-bestanden en de index leest en schrijft. Vereist PHP 8.2 of hoger. |
| gitonomy/gitlib | Goed inRepositorytoegang vanuit PHP 8.4 of hoger zonder iets te bouwen. Het werkt door shell-opdrachten naar git uit te voeren. | Verschil met PitmasterPitmaster voert geen shell-opdrachten uit voor kerntaken, en een handle zonder processen schakelt de onderdelen uit die anders een proces zouden starten. |
| libgit2 | Goed inEen portable C-implementatie van de kernmethoden van Git als linkbare library, met bindings voor Ruby, .NET, Python, Node.js, Rust en meer. | Verschil met PitmasterPitmaster is gewone PHP die met Composer wordt geïnstalleerd, zonder gecompileerde library of FFI. Het importeert 63 oracle-scenario's uit de testbronnen van libgit2. |
Bronnen, aangevinkt
Vragen en antwoorden
Korte antwoorden uit de documentatie van Pitmaster.
Nee. Kerntaken voor repositories gebruiken de git-binary of FFI niet. Objecten, refs, pack-bestanden, de index en smart HTTP worden afgehandeld in PHP.
Ja. Geef Pitmaster::processFreeOptions() of ['processes' => false] door bij het openen van de repository. Hooks, clone, fetch, push en SSH-procest transport worden dan uitgeschakeld, terwijl lokaal lezen en schrijven beschikbaar blijft.
Ja, hooks zijn standaard ingeschakeld en worden uitgevoerd via proc_open(). Geef ['hooks' => false] door aan Pitmaster::open(), Pitmaster::init() of Pitmaster::clone() om de scripts in .git/hooks voor die handle over te slaan.
Pitmaster::clone(), fetch() en push() gebruiken SSH voor SSH-URL's en anders smart HTTP; clone en fetch vallen terug op dumb HTTP als de smart uitwisseling mislukt. SSH gebruikt de ssh2-extensie als die is geladen, en anders de ssh-binary van het systeem.
Ja. Geef 'sha256' als tweede argument door aan Pitmaster::init() of voer init uit met --object-format=sha256. Objecten gebruiken dan hashes van 64 tekens.
Nee. Het weerspiegelt een subset van git-opdrachten, zoals log, status, diff, commit, merge, blame en grep. Clone, fetch en push zijn alleen beschikbaar via de PHP API.
Begin met de handleiding Aan de slag om je eerste repository te openen vanuit PHP en gebruik daarna de verwijzingen naar API en CLI voor de rest.