Κατάσταση
Το Pitmaster υπολογίζει την κατάσταση του working tree συγκρίνοντας τρεις καταστάσεις: το δέντρο του commit HEAD, το index (περιοχή σταδιοποίησης) και το working tree (τα πραγματικά αρχεία στον δίσκο). Το CLI εκτυπώνει μια σύνοψη τύπου git status, ενώ το statusPorcelainV2() εκτυπώνει τη μορφή porcelain του git v2.
Βασική χρήση
$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:
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
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:
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 εκτελεί τη σύγκριση τριών κατευθύνσεων:
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 για να καθορίσει ποια μη παρακολουθούμενα αρχεία πρέπει να αναφερθούν ως αρχεία που αγνοούνται ή ως μη παρακολουθούμενα.
use Pitmaster\Status\GitIgnore;
Η κλάση GitIgnore αναλύει μοτίβα gitignore από:
.gitignoreστη ρίζα του αποθετηρίου.gitignoreσε υποκαταλόγους.git/info/exclude
Υποστηριζόμενη σύνταξη μοτίβων:
- Μοτίβα Glob (
*.log,build/) - Άρνηση (
!important.log) - Μοτίβα μόνο για καταλόγους (τελικό
/) - Αρχικό
/για μοτίβα σχετικά με τη ρίζα **για αναδρομική αντιστοίχιση
Κατηγοριοποίηση εγγραφών κατάστασης
Ένα συνηθισμένο μοτίβο εμφάνισης για το UI:
$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:
use Pitmaster\Status\Fsmonitor;
Η κλάση Fsmonitor μπορεί να ερωτήσει το hook core.fsmonitor (με εναλλακτική σάρωση βάσει χρόνου τροποποίησης) για να μάθει ποια αρχεία άλλαξαν μετά από ένα token. Απενεργοποιείται για handles που ανοίχτηκαν με ['processes' => false]. Το status() δεν το καλεί προς το παρόν· συγκρίνει απευθείας δεδομένα stat και περιεχόμενο.