Repozitoriju lasīšana
Pitmaster lasa git repozitorijus, tieši parsējot diskā saglabātos formātus: nesaspiestos objektus (zlib saspiestus failus mapē .git/objects/), pakotņu failus (.git/objects/pack/), atsauces (failus mapēs .git/refs/ un packed-refs) un indeksu (.git/index).
Repozitorija atvēršana
use Pitmaster\Pitmaster;
$repo = Pitmaster::open('/path/to/project');
Pitmaster atbalsta trīs repozitoriju izkārtojumus:
- Parastie repozitoriji:
.gitir direktorijs projekta saknē. - Saistītie darba koki:
.gitir fails, kas saturgitdir: <path>ar norādi uz.git/worktrees/<name>/. - Tukši repozitoriji: pašā ceļā atrodas
HEAD,objects/u.c.
// Detection helpers
Pitmaster::isRepository('/path'); // true for any of the above
Pitmaster::isWorktree('/path'); // true only for linked worktrees
Objektu lasīšana
Katrs datu elements git repozitorijā tiek glabāts kā objekts, ko identificē tā jaucējvērtība: pēc noklusējuma SHA-1 (40 heksadecimālās rakstzīmes) vai SHA-256 (64 heksadecimālās rakstzīmes) repozitorijos, kas izveidoti ar Pitmaster::init($path, 'sha256'). Ir četri objektu veidi: blob, koks, commits un tag.
Tālāk norādītās metodes, kurās izmanto jaucējvērtību, pieņem pilnu heksadecimālo jaucējvērtību; saīsinātas jaucējvērtības netiek pieņemtas.
readObject
use Pitmaster\Object\Blob;
use Pitmaster\Object\Tree;
use Pitmaster\Object\Commit;
use Pitmaster\Object\Tag;
$object = $repo->readObject('a1b2c3d4e5f6...');
match (true) {
$object instanceof Blob => handleBlob($object),
$object instanceof Tree => handleTree($object),
$object instanceof Commit => handleCommit($object),
$object instanceof Tag => handleTag($object),
};
Objekti vispirms tiek meklēti nesaspiestajā krātuvē, pēc tam pakotņu failos. Pakotņu failu meklēšanā tiek izmantota .idx izkliedes tabula, lai veiktu O(log n) bināro meklēšanu.
catFile
Vienkāršai satura izgūšanai bez tipa pārbaudes:
$content = $repo->catFile('a1b2c3d4e5f6...');
echo $content;
objectExists
if ($repo->objectExists('a1b2c3d4e5f6...')) {
// Object is in the repository
}
listObjects
$hashes = $repo->listObjects();
// ['a1b2c3d4...', 'f6e5d4c3...', ...]
Atgriež visu objektu heksadecimālās jaucējvērtības (nesaspiestos un sapakotos objektus).
Darbs ar blob objektiem
Blob satur neapstrādātu faila saturu.
$blob = $repo->readObject($hash);
echo $blob->content; // Raw file bytes
echo $blob->size(); // Content length
echo $blob->id->hex; // Object hash
Darbs ar kokiem
Koks ir direktorija saraksts. Katram ierakstam ir režīms, nosaukums un jaucējvērtība.
$tree = $repo->readObject($hash);
foreach ($tree->entries as $entry) {
echo "{$entry->mode} {$entry->name} {$entry->hash->hex}\n";
// 100644 README.md abc123...
// 40000 src def456...
// 100755 deploy.sh 789012...
if ($entry->isTree()) {
// Recurse into subdirectory (mode 40000)
} elseif ($entry->isExecutable()) {
// Executable file (mode 100755)
} elseif ($entry->isBlob()) {
// Regular file (any 10xxxx mode, so executables match too)
} elseif ($entry->isSymlink()) {
// Symbolic link (mode 120000)
} elseif ($entry->isGitlink()) {
// Submodule (mode 160000)
}
}
Darbs ar komitiem
Commits sasaista koka momentuzņēmumu ar tā vecākiem un metadatiem.
$commit = $repo->head();
echo $commit->id->hex; // Full object hash
echo $commit->tree->hex; // Tree object hash
echo $commit->author; // "Name <email> timestamp tz"
echo $commit->committer; // "Name <email> timestamp tz"
echo $commit->message; // Full commit message
// Parent commits
foreach ($commit->parents as $parentId) {
$parent = $repo->readObject($parentId->hex);
}
// Merge detection
if ($commit->isMerge()) {
// Two or more parents
}
Darbs ar tagiem
Anotētie tagi ir objekti ar mērķi, tipu, nosaukumu, taga autoru un ziņojumu.
$tag = $repo->readObject($hash);
echo $tag->object->hex; // Target object hash
echo $tag->objectType->value; // 'commit', 'tree', 'blob', or 'tag'
echo $tag->name; // Tag name
echo $tag->tagger; // "Name <email> timestamp tz"
echo $tag->message; // Tag message
Atsauču lasīšana
Pašreizējais HEAD
$commit = $repo->head();
Atrisina HEAD (sekojot simboliskām atsaucēm, piemēram, HEAD -> refs/heads/main -> commit hash) un atgriež komita objektu.
Pašreizējais zars
$branch = $repo->branch(); // 'main' or null if detached
Zaru un tagu uzskaitījums
$branches = $repo->branches(); // ['bugfix/typo', 'feature/login', 'main']
$tags = $repo->tags(); // ['v1.0.0', 'v1.1.0']
Visas atsauces
$refs = $repo->allRefs();
// [
// 'refs/heads/main' => 'abc123...',
// 'refs/heads/feature' => 'def456...',
// 'refs/tags/v1.0.0' => '789012...',
// 'refs/remotes/origin/main' => 'abc123...',
// ]
Versiju atrisināšana
$id = $repo->resolve('HEAD');
$id = $repo->resolve('main');
$id = $repo->resolve('v1.0.0');
$id = $repo->resolve('HEAD~3');
$id = $repo->resolve('main^2');
$id = $repo->resolve('3f2c1e0b9d6a4f8e7c5b2a1d0e9f8c7b6a5d4e3f');
Versiju parsētājs atbalsta ~N (priekšteča) un ^N (vecāka) operatorus, kurus var patvaļīgi ķēdēt. Jaucējvērtības jānorāda pilnā garumā.
Komitu vēstures pārlūkošana
log
Commits tiek atgriezti, sākot ar jaunāko, un sakārtoti pēc komitētāja laika zīmoga.
// Last 20 commits from HEAD
$commits = $repo->log(20);
foreach ($commits as $commit) {
$short = substr($commit->id->hex, 0, 7);
echo "{$short} {$commit->message}\n";
}
log no konkrēta komita
$from = $repo->resolve('feature/login');
$commits = $repo->log(10, $from);
log filtrēšana pēc faila ceļa
$commits = $repo->logPath('src/Repository.php', 20);
Atgriež tikai tos komitus, kuros norādītais fails ir mainīts (pievienots, modificēts, dzēsts vai pārdēvēts), salīdzinot ar pirmo vecāku. Jānorāda precīzs faila ceļš; direktoriji netiek atpazīti. Tiek pārbaudīti tikai jaunākie 5 * $limit commiti, tāpēc vecākas atbilstības var netikt atrastas (#7).
show
$result = $repo->show('HEAD');
$commit = $result['commit'];
$diffs = $result['diff'];
echo "Author: {$commit->author}\n";
echo "Message: {$commit->message}\n\n";
foreach ($diffs as $diff) {
echo $diff->format();
}
Noklusējuma zara noteikšana
$default = $repo->defaultBranch();
// Checks: remote HEAD symref -> local HEAD -> main/master fallback
Ja ir iestatīts remote.origin.url un procesi ir iespējoti, pirmajā pārbaudē tiek nosūtīts viedais HTTP pieprasījums attālajam repozitorijam. Tīkla kļūdas tiek ignorētas, un pēc tam tiek veiktas lokālās pārbaudes.
Sapludināšanas priekšteči
// Is feature fully merged into main?
$merged = $repo->isBranchMerged('feature/done', 'main');
// Find the merge base of two commits
$base = $repo->mergeBase(
$repo->resolve('main'),
$repo->resolve('feature/login'),
);