Kom igång
Installation
Installera Pitmaster via Composer:
composer require pitmaster/pitmaster
Krav
- PHP 8.2+ med skrivskyddade klasser, enum-typer och konstruktorfrämjande
- ext-zlib för objektkomprimering/dekomprimering (inbyggt i de flesta installationer)
- ext-json för åtgärdstillståndsfiler och Git LFS-API-nyttolaster
- ext-mbstring, deklarerat i
composer.json, så Composer kräver det vid installationen - ext-ctype för hashvalidering (aktiverat i de flesta PHP-byggen, men inte deklarerat i
composer.json)
Grundläggande förrådsåtgärder kräver inte binärfilen git, FFI eller externa hjälpverktyg. Valfria funktioner har ytterligare körningskrav: körning av hooks använder proc_open(), och transport via SSH använder ext-ssh2 när det är inläst; annars startas systemets binärfil ssh via proc_open().
Öppna ett befintligt förråd
use Pitmaster\Pitmaster;
$repo = Pitmaster::open('/path/to/project');
Detta öppnar förrådet på den angivna sökvägen. Pitmaster hittar katalogen .git (eller löser en .git-fil för länkade arbetskataloger) och initierar objektdatabasen, referensdatabasen och konfigurationen.
open(), init() och clone() accepterar en alternativmatris som sitt sista argument:
// Do not run .git/hooks scripts for this handle
$repo = Pitmaster::open('/path/to/project', ['hooks' => false]);
// Do not start any process: no hooks, no fsmonitor hook, no clone/fetch/push, no SSH
$repo = Pitmaster::open('/path/to/project', Pitmaster::processFreeOptions());
Hooks körs som standard. Pitmaster::processFreeOptions() returnerar ['processes' => false, 'hooks' => false]; lokala läsningar och skrivningar fungerar fortfarande med ett sådant handtag.
Kontrollera om en sökväg är ett förråd
if (Pitmaster::isRepository('/path/to/project')) {
$repo = Pitmaster::open('/path/to/project');
}
Initiera ett nytt förråd
$repo = Pitmaster::init('/path/to/new-project');
Detta skapar katalogstrukturen .git med objekt, referenser, HEAD (som pekar på refs/heads/main) och en standardkonfiguration.
Skapa ett förråd av typen SHA-256 genom att ange objektformatet som det andra argumentet:
$repo = Pitmaster::init('/path/to/new-project', 'sha256');
Objekt-ID:n i det förrådet är 64 hexadecimala tecken, och konfigurationen registrerar extensions.objectformat = sha256. Förråd som öppnas senare hämtar formatet från den konfigurationsposten.
Läs HEAD-committen
$head = $repo->head();
echo "Commit: {$head->id->hex}\n";
echo "Author: {$head->author}\n";
echo "Message: {$head->message}\n";
Metoden head() löser upp HEAD (följer symboliska referenser) och returnerar ett Commit-objekt.
Lista grenar och taggar
// All branch names
$branches = $repo->branches();
// ['main', 'feature/login', 'bugfix/typo']
// Current branch name (null if detached)
$current = $repo->branch();
// 'main'
// All tag names
$tags = $repo->tags();
// ['v1.0.0', 'v1.1.0']
Gå igenom commit-historiken
// Last 20 commits from HEAD
$commits = $repo->log(20);
foreach ($commits as $commit) {
echo substr($commit->id->hex, 0, 7) . " {$commit->message}\n";
}
Du kan också börja från en specifik commit:
$from = $repo->resolve('feature/login');
$commits = $repo->log(10, $from);
Kontrollera arbetskatalogens status
use Pitmaster\Status\FileStatus;
$entries = $repo->status();
foreach ($entries as $entry) {
if ($entry->index === FileStatus::Untracked) {
echo "?? {$entry->path}\n";
} elseif ($entry->index === FileStatus::Modified) {
echo "M {$entry->path}\n";
} elseif ($entry->worktree === FileStatus::Modified) {
echo " M {$entry->path}\n";
}
}
Lägg till filer i staging och skapa en commit
// Stage specific files
$repo->add('src/Feature.php', 'tests/FeatureTest.php');
// Create a commit
$commitId = $repo->commit('Add new feature with tests');
echo "Created commit: {$commitId->hex}\n";
Författarens namn och e-postadress hämtas i följande ordning: miljövariablerna PITMASTER_AUTHOR_NAME / PITMASTER_AUTHOR_EMAIL, miljövariablerna GIT_AUTHOR_NAME / GIT_AUTHOR_EMAIL, konstanterna PITMASTER_AUTHOR_NAME / PITMASTER_AUTHOR_EMAIL, förrådets egen .git/config (user.name och user.email) och slutligen Pitmaster <pitmaster@localhost>. Endast förrådets konfigurationsfil (och filer som den inkluderar) läses, inte ~/.gitconfig. Commit-författaren hämtas på samma sätt från namnen *_COMMITTER_* och faller tillbaka på författarkonstanterna.
Beräkna skillnader
// Unstaged changes (worktree vs index)
$diffs = $repo->diff();
foreach ($diffs as $diff) {
echo $diff->format(); // Unified diff output
}
// Staged changes (index vs HEAD)
$staged = $repo->diffStaged();
Klona ett fjärrförråd
$repo = Pitmaster::clone('https://github.com/user/repo.git', '/path/to/destination');
Det här upptäcker referenser, hämtar pack-filen, konfigurerar fjärrspårningsgrenar och checkar ut standardgrenen. HTTP(S) URL:er använder smart HTTP och faller tillbaka på dumb HTTP; SSH-URL:er använder transporten SSH. Ange ett djup som det tredje argumentet för en ytlig klon: Pitmaster::clone($url, $path, 1).
Läs valfritt objekt med hash
$object = $repo->readObject($fullHash); // full 40-character (or 64 for SHA-256) hex hash
if ($object instanceof \Pitmaster\Object\Blob) {
echo $object->content;
} elseif ($object instanceof \Pitmaster\Object\Commit) {
echo $object->message;
}
Konfiguration
Pitmaster följer repositoryts .git/config för författarinformation och fjärr-URL:er. Du kan också ange globala standardvärden med konstanterna PHP som definieras innan Pitmaster körs:
define('PITMASTER_AUTHOR_NAME', 'Your Name');
define('PITMASTER_AUTHOR_EMAIL', 'you@example.com');
define('PITMASTER_HTTP_TIMEOUT', 60); // Seconds
define('PITMASTER_MAX_DELTA_CHAIN', 50); // Max delta chain depth
define('PITMASTER_OBJECT_CACHE_BYTES', '64M');
| Konstant | Standardvärde | Effekt |
|---|---|---|
PITMASTER_AUTHOR_NAME, PITMASTER_AUTHOR_EMAIL |
none | Författaridentitet (se ordningen ovan) |
PITMASTER_COMMITTER_NAME, PITMASTER_COMMITTER_EMAIL |
författarvärden | Committeridentitet |
PITMASTER_HTTP_TIMEOUT |
30 |
Timeout i sekunder för smart HTTP (heltal) |
PITMASTER_MAX_DELTA_CHAIN |
50 |
Maximalt djup för deltakedjor vid läsning av pack-filer (heltal) |
PITMASTER_OBJECT_CACHE_ENTRIES |
1024 |
Objekt som behålls i objektcachen i minnet |
PITMASTER_OBJECT_CACHE_BYTES |
16M |
Bytegräns för objektcachen |
PITMASTER_PACK_RESOLVED_CACHE_ENTRIES |
4096 |
Lösta deltaobjekt som cachas per pack |
PITMASTER_PACK_RESOLVED_CACHE_BYTES |
32M |
Bytegräns för den packcachen |
PITMASTER_MAX_PACK_MEMORY |
none | Äldre namn för packcachens bytegräns, används endast när PITMASTER_PACK_RESOLVED_CACHE_BYTES inte är definierad |
Bytevärden godtar ett heltal eller en sträng med suffixet k, m eller g ('256M'). Ogiltiga värden återgår till standardvärdet.
Miljövariabler åsidosätter identitetskonstanterna: PITMASTER_AUTHOR_NAME, PITMASTER_AUTHOR_EMAIL, PITMASTER_AUTHOR_DATE, motsvarande PITMASTER_COMMITTER_*-variabler samt gits egna variabler GIT_AUTHOR_* och GIT_COMMITTER_*. Transporten SSH läser variablerna PITMASTER_SSH_*, som beskrivs i Protokoll.
Det finns ingen konstant för hash-algoritmen. Objektformatet väljs när repot skapas (Pitmaster::init($path, 'sha256') eller init --object-format=sha256 på CLI) och läses därefter från repots konfiguration.