Μετάβαση στο περιεχόμενο

Κατάσταση

Το Pitmaster υπολογίζει την κατάσταση του working tree συγκρίνοντας τρεις καταστάσεις: το δέντρο του commit HEAD, το index (περιοχή σταδιοποίησης) και το working tree (τα πραγματικά αρχεία στον δίσκο). Το CLI εκτυπώνει μια σύνοψη τύπου git status, ενώ το statusPorcelainV2() εκτυπώνει τη μορφή porcelain του git v2.

Βασική χρήση

PHP
$entries = $repo->status();

foreach ($entries as $entry) {
    echo $entry->shortFormat() . "\n";
}

Το shortFormat() εκτυπώνει τη σύντομη μορφή του git:

Κώδικας
M  src/Modified.php          (staged modification)
 M src/WorktreeModified.php  (unstaged modification)
A  src/NewFile.php           (staged new file)
 D src/Deleted.php           (deleted in worktree)
?? untracked.txt             (untracked file)

StatusEntry

Η κατάσταση κάθε αρχείου αναπαρίσταται με ένα StatusEntry:

PHP
use Pitmaster\Status\StatusEntry;

$entry->path;       // File path relative to repo root
$entry->index;      // FileStatus: HEAD-to-index state
$entry->worktree;   // FileStatus: index-to-worktree state
$entry->origPath;   // Original path for renamed entries, otherwise null
$entry->renameScore; // Similarity score for renamed entries, otherwise null
$entry->shortFormat(); // "XY path", "?? path", or "R  old -> new"

Απαρίθμηση FileStatus

PHP
use Pitmaster\Status\FileStatus;

FileStatus::Added;      // 'A' - new file
FileStatus::Modified;   // 'M' - content changed
FileStatus::Deleted;    // 'D' - file removed
FileStatus::Renamed;    // 'R' - file renamed
FileStatus::Copied;     // 'C' - file copied
FileStatus::Unmerged;   // 'U' - unresolved merge conflict
FileStatus::Untracked;  // '?' - not in index
FileStatus::Ignored;    // '!' - matched by .gitignore
FileStatus::Unmodified; // ' ' - no change

Το status() δεν αναφέρει αρχεία που αγνοούνται, επομένως το Ignored δεν εμφανίζεται στο αποτέλεσμά του.

Έξοδος Porcelain v2

Για έξοδο κατάστασης αναγνώσιμη από μηχανές, συμβατή με το git status --porcelain=v2:

PHP
echo $repo->statusPorcelainV2();

Έξοδος:

Κώδικας
1 .M N... 100644 100644 100644 ce013625030ba8dba906f756967f9e9ca394464a ce013625030ba8dba906f756967f9e9ca394464a modified-file.txt
? untracked-file.txt

Πρώτα εμφανίζονται οι παρακολουθούμενες εγγραφές και έπειτα οι μη παρακολουθούμενες. Οι μετονομασίες χρησιμοποιούν γραμμές 2 και οι συγκρούσεις γραμμές u. Οι κεφαλίδες # branch του git status --porcelain=v2 --branch δεν εκτυπώνονται και τα αρχεία που αγνοούνται δεν καταχωρίζονται.

Πώς υπολογίζεται η κατάσταση

Η κλάση WorkingTreeStatus εκτελεί τη σύγκριση τριών κατευθύνσεων:

PHP
use Pitmaster\Status\WorkingTreeStatus;

$status = new WorkingTreeStatus($repo->objectDatabase(), $repo->workDir(), $repo->gitDir());
$entries = $status->compute($repo->index(), $repo->resolve('HEAD'));

Βήμα 1: Δημιουργία χάρτη δέντρου HEAD

Ισοπεδώστε το δέντρο του commit HEAD σε έναν χάρτη path => blob hash. Αυτό αναπαριστά την τελευταία κατάσταση που έγινε commit.

Βήμα 2: Σύγκριση HEAD με index

Για κάθε αρχείο στο δέντρο HEAD και στο index:

  • Στο HEAD αλλά όχι στο index: Deleted στη στήλη index
  • Στο index αλλά όχι στο HEAD: Added στη στήλη index
  • Και στα δύο, αλλά με διαφορετικό hash: Modified στη στήλη index
  • Και στα δύο με το ίδιο hash: Unmodified στη στήλη index

Βήμα 3: Σύγκριση index με worktree

Για κάθε αρχείο στο index και στο working tree:

  • Στο index αλλά όχι στον δίσκο: Deleted στη στήλη worktree
  • Και στα δύο, αλλά με διαφορετικό περιεχόμενο: Modified στη στήλη worktree
  • Και στα δύο με ίδιο περιεχόμενο: Unmodified στη στήλη worktree

Βήμα 4: Εντοπισμός μη παρακολουθούμενων αρχείων

Περιηγηθείτε στον κατάλογο του working tree, παραλείψτε το .git/ και τις διαδρομές που αγνοούνται και αναφέρετε ως Untracked και στις δύο στήλες τα αρχεία που δεν υπάρχουν στο index.

Υποστήριξη .gitignore

Το Pitmaster αναλύει αρχεία .gitignore για να καθορίσει ποια μη παρακολουθούμενα αρχεία πρέπει να αναφερθούν ως αρχεία που αγνοούνται ή ως μη παρακολουθούμενα.

PHP
use Pitmaster\Status\GitIgnore;

Η κλάση GitIgnore αναλύει μοτίβα gitignore από:

  • .gitignore στη ρίζα του αποθετηρίου
  • .gitignore σε υποκαταλόγους
  • .git/info/exclude

Υποστηριζόμενη σύνταξη μοτίβων:

  • Μοτίβα Glob (*.log, build/)
  • Άρνηση (!important.log)
  • Μοτίβα μόνο για καταλόγους (τελικό /)
  • Αρχικό / για μοτίβα σχετικά με τη ρίζα
  • ** για αναδρομική αντιστοίχιση

Κατηγοριοποίηση εγγραφών κατάστασης

Ένα συνηθισμένο μοτίβο εμφάνισης για το UI:

PHP
$staged = [];
$unstaged = [];
$untracked = [];

foreach ($repo->status() as $entry) {
    if ($entry->index === FileStatus::Untracked) {
        $untracked[] = $entry;
    } elseif ($entry->index !== FileStatus::Unmodified) {
        $staged[] = $entry;
    }

    if ($entry->worktree !== FileStatus::Unmodified
        && $entry->index !== FileStatus::Untracked
    ) {
        $unstaged[] = $entry;
    }
}

Χρήση CLI

Κέλυφος
./vendor/bin/pitmaster status

Έξοδος:

Κώδικας
On branch main

Changes to be committed:
	new file:   src/Feature.php

Changes not staged for commit:
	modified:   src/Existing.php

Untracked files:
	notes.txt

Παρακολούθηση αρχείων

Το Pitmaster περιλαμβάνει βοηθητικό εργαλείο για το πρωτόκολλο fsmonitor του git:

PHP
use Pitmaster\Status\Fsmonitor;

Η κλάση Fsmonitor μπορεί να ερωτήσει το hook core.fsmonitor (με εναλλακτική σάρωση βάσει χρόνου τροποποίησης) για να μάθει ποια αρχεία άλλαξαν μετά από ένα token. Απενεργοποιείται για handles που ανοίχτηκαν με ['processes' => false]. Το status() δεν το καλεί προς το παρόν· συγκρίνει απευθείας δεδομένα stat και περιεχόμενο.