Pāriet uz saturu

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

PHP
use Pitmaster\Pitmaster;

$repo = Pitmaster::open('/path/to/project');

Pitmaster atbalsta trīs repozitoriju izkārtojumus:

  1. Parastie repozitoriji: .git ir direktorijs projekta saknē.
  2. Saistītie darba koki: .git ir fails, kas satur gitdir: <path> ar norādi uz .git/worktrees/<name>/.
  3. Tukši repozitoriji: pašā ceļā atrodas HEAD, objects/ u.c.
PHP
// 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

PHP
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:

PHP
$content = $repo->catFile('a1b2c3d4e5f6...');
echo $content;

objectExists

PHP
if ($repo->objectExists('a1b2c3d4e5f6...')) {
    // Object is in the repository
}

listObjects

PHP
$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.

PHP
$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.

PHP
$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.

PHP
$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.

PHP
$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

PHP
$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

PHP
$branch = $repo->branch();  // 'main' or null if detached

Zaru un tagu uzskaitījums

PHP
$branches = $repo->branches();  // ['bugfix/typo', 'feature/login', 'main']
$tags = $repo->tags();          // ['v1.0.0', 'v1.1.0']

Visas atsauces

PHP
$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

PHP
$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.

PHP
// 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

PHP
$from = $repo->resolve('feature/login');
$commits = $repo->log(10, $from);

log filtrēšana pēc faila ceļa

PHP
$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

PHP
$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

PHP
$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

PHP
// 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'),
);