Εισαγωγή
Το Pitmaster είναι μια καθαρή βιβλιοθήκη PHP που διαβάζει και γράφει εγγενώς αποθετήρια Git. Οι βασικές λειτουργίες αποθετηρίου δεν εκκινούν το εκτελέσιμο αρχείο git μέσω shell ούτε χρησιμοποιούν FFI. Το μοντέλο αντικειμένων Git, η μορφή αρχείων pack, η μορφή index και το transport smart HTTP υλοποιούνται σε PHP.
Γιατί υπάρχει το Pitmaster
Οι εφαρμογές PHP που αλληλεπιδρούν με αποθετήρια Git συνήθως εκκινούν το εκτελέσιμο αρχείο git μέσω shell. Αυτό λειτουργεί, αλλά δημιουργεί σκληρή εξάρτηση από την εγκατάσταση του git, εγείρει ζητήματα ασφάλειας γύρω από τα exec() και proc_open() και δυσκολεύει την ανάπτυξη της εφαρμογής σε περιορισμένα περιβάλλοντα (containers χωρίς git, κοινόχρηστη φιλοξενία, συναρτήσεις serverless).
Το Pitmaster αφαιρεί την εξάρτηση από το git για τις βασικές εργασίες αποθετηρίου. Η εφαρμογή σας PHP μπορεί να διαβάζει το ιστορικό των commit, να δημιουργεί commit, να υπολογίζει diff, να ελέγχει την κατάσταση και να κάνει push σε απομακρυσμένα αποθετήρια μέσω smart HTTP, χρησιμοποιώντας μόνο τις ενσωματωμένες λειτουργίες του PHP. Οι hooks και το transport SSH αποτελούν εξαιρέσεις: και τα δύο εκκινούν διεργασίες και μπορούν να απενεργοποιηθούν ανά handle αποθετηρίου (βλ. Hooks).
Τι κάνει
- Διαβάζει και γράφει loose αντικείμενα (blob, tree, commit, tag)
- Διαβάζει αρχεία pack και επιλύει αλυσίδες delta (OFS_DELTA και REF_DELTA)
- Γράφει αρχεία pack για λειτουργίες δικτύου
- Διαβάζει και γράφει το index/περιοχή staging (μορφές v2, v3, v4)
- Διαβάζει και γράφει refs (branches, tags, HEAD, packed-refs, reftable)
- Υπολογίζει diff (αλγόριθμοι Myers, Patience, Histogram και Minimal) στη unified μορφή του git
- Εκτελεί συγχωνεύσεις τριών κατευθύνσεων με εντοπισμό συγκρούσεων
- Διασχίζει γραφήματα commit (log, ancestry, merge base)
- Υποστηρίζει το πρωτόκολλο smart Git HTTP (clone, fetch, push)
- Υποστηρίζει worktrees, submodules, stash, hooks και Git LFS
Απαιτήσεις
- PHP 8.2 ή νεότερο
- Επέκταση
zlib(ενσωματωμένη σχεδόν σε όλες τις εγκαταστάσεις PHP) - Επέκταση
json - Επέκταση
mbstring(δηλωμένη στοcomposer.json, επομένως το Composer τη χρειάζεται κατά την εγκατάσταση) - Επέκταση
ctype(χρησιμοποιείται για την επικύρωση hash αντικειμένων· ενεργοποιημένη στις περισσότερες εκδόσεις PHP, αλλά δεν δηλώνεται στοcomposer.json)
Οι βασικές λειτουργίες αποθετηρίου δεν απαιτούν το εκτελέσιμο αρχείο git. Προαιρετικές λειτουργίες μπορεί να χρειάζονται πρόσθετες δυνατότητες κατά τον χρόνο εκτέλεσης: η εκτέλεση hook χρησιμοποιεί proc_open(), ενώ το transport SSH χρησιμοποιεί ext-ssh2 όταν είναι φορτωμένο και διαφορετικά εκκινεί το εκτελέσιμο αρχείο συστήματος ssh μέσω proc_open().
Γρήγορο παράδειγμα
use Pitmaster\Pitmaster;
$repo = Pitmaster::open('/path/to/project');
// Read the current HEAD commit
$head = $repo->head();
echo $head->message;
// List branches
foreach ($repo->branches() as $branch) {
echo $branch . "\n";
}
// Check status
foreach ($repo->status() as $entry) {
echo "{$entry->path}: {$entry->index->value}{$entry->worktree->value}\n";
}
// Create a commit
$repo->add('src/Feature.php');
$commitId = $repo->commit('Add new feature');
Ξεκινήστε με το Ξεκινώντας και έπειτα δείτε τα API, CLI και Λειτουργίες για το υπόλοιπο εύρος λειτουργιών. Η ενότητα Δοκιμές εξηγεί πώς ελέγχεται το Pitmaster σε σχέση με το git.