Pitmaster
Git у PHP: читання й запис репозиторіїв, diff, злиття та обмін через smart HTTP без запуску git.
composer require pitmaster/pitmasterОстанній випуск v0.2.11 MIT PHP 8.2+
# List all branches (current marked with *)
./bin/pitmaster branch
# Create a new branch from HEAD
./bin/pitmaster branch feature/new-thing
# Delete a branch
./bin/pitmaster branch -d feature/old
./bin/pitmaster branch -D feature/oldНа практиці
Відкрийте репозиторій, а потім читайте й записуйте дані викликами методів або з командного рядка.
Читання репозиторію з PHP
Pitmaster::open() знаходить каталог .git і повертає дескриптор репозиторію. Кожен запис про статус має окремий стан для індексу й робочого дерева.
З командного рядка ./vendor/bin/pitmaster відтворює частину команд git і працює з інсталяції Composer, оскільки 0.2.11.
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";
}./vendor/bin/pitmaster log
./vendor/bin/pitmaster status
./vendor/bin/pitmaster diff
./vendor/bin/pitmaster show HEAD
./vendor/bin/pitmaster add file.txt
./vendor/bin/pitmaster commit -m "message"
./vendor/bin/pitmaster branch feature
./vendor/bin/pitmaster checkout feature
./vendor/bin/pitmaster merge featureБез бінарного файлу git
Основні операції виконуються в PHP 8.2+ без бінарного файлу git чи FFI. Хуки та резервний варіант SSH запускають процеси, якщо не передати ['hooks' => false] або processFreeOptions().
Читання й запис
Окремі об’єкти, файли pack із розв’язанням delta, індекс, посилання та конфігурація. git читає те, що записує Pitmaster, для версій індексу 2 і 3 та окремих посилань.
Diff і злиття
Алгоритми diff Myers, patience та histogram із виявленням перейменувань. Тристороннє злиття з маркерами конфліктів.
Мережевий протокол
Клонування, отримання й надсилання через smart HTTP або SSH, із резервним dumb HTTP для клонування й отримання. Протокол v2 доступний через клієнти нижчого рівня.
Операції Git
додавання, фіксація змін, стан, різниця, злиття, перемикання, скидання, тимчасове збереження, вибіркове перенесення змін, скасування, перебазування, авторство змін, пошук.
CLI
22 команди в стилі git, зокрема init, log, status, diff, add, commit, branch, merge, stash, blame і grep. Клонування, отримання й надсилання доступні лише через бібліотеку.
Перевірено оракулом
761 сценаріїв порівнюють результати з виводом справжнього git і запускаються в CI; 605 походять із наборів тестів самого git, libgit2, go-git, isomorphic-git, dulwich і JGit.
Повний пошук
blame, grep, bisect, notes і фільтр шляхів у журналі без запуску git.
Чому Pitmaster
Працює без інсталяції git
Коміти, diff, статус і журнал обчислюються в PHP, тож контейнери й хости без бінарного файла git також можуть працювати з репозиторіями.
Дескриптори без процесів
Pitmaster::processFreeOptions() вимикає хуки, хуки fsmonitor, клонування, отримання, надсилання та транспорт процесів SSH. Локальне читання й запис продовжують працювати.
Перевірено за допомогою git
Інтеграційні тести запускаються з бінарним файлом git, а матриця підтримки показує, скільки функцій 146 із 146, що входять до сфери підтримки, перевірено оракулом у межах заявленої сфери сумісності.
SHA-1 і SHA-256
Створіть репозиторій SHA-256 за допомогою Pitmaster::init($path, 'sha256') або init --object-format=sha256. Файли pack читаються й записуються; файли commit-graph, multi-pack index і reftable можна читати.
Порівняно з
Інші способи працювати з репозиторіями Git із PHP та відмінності Pitmaster.
| Інструмент | Переваги | Відмінність від Pitmaster |
|---|---|---|
| git (командний рядок) | ПеревагиЕталонна реалізація з багатим набором команд, що охоплює операції високого рівня й повний доступ до внутрішніх компонентів. | Відмінність від PitmasterPitmaster працює всередині процесу PHP, а основні операції не запускають git. Його CLI відтворює лише частину команд git. |
| czproject/git-php | ПеревагиКомпактна PHP API для init, clone, commit, merge, гілок, тегів і віддалених репозиторіїв. Працює на PHP 8.0 або новішій версії та використовує встановлений клієнт git. | Відмінність від PitmasterДля основних операцій Pitmaster не потрібен клієнт git, оскільки сама читає й записує об’єкти, файли pack та індекс. Потрібна PHP 8.2 або новіша версія. |
| gitonomy/gitlib | ПеревагиДоступ до репозиторіїв у PHP 8.4 або новішій версії без збирання. Працює, викликаючи git через командний рядок. | Відмінність від PitmasterPitmaster не запускає команд оболонки для основних операцій, а дескриптор без процесів вимикає частини, які запускали б процес. |
| libgit2 | ПеревагиПортативна реалізація основних методів Git мовою C у вигляді бібліотеки для компонування, з прив’язками для Ruby, .NET, Python, Node.js, Rust та інших мов. | Відмінність від PitmasterPitmaster — звичайний PHP, що встановлюється за допомогою Composer, без скомпільованої бібліотеки чи FFI. Для 63 сценаріїв оракула імпортовано тестові ресурси libgit2. |
Джерела, позначено
Запитання та відповіді
Короткі відповіді з документації Pitmaster.
Ні. Для основних операцій із репозиторієм не використовуються бінарний файл git чи FFI. Обробка об’єктів, посилань, файлів pack, індексу й smart HTTP виконується в PHP.
Так. Під час відкриття репозиторію передайте Pitmaster::processFreeOptions() або ['processes' => false]. Тоді буде вимкнено хуки, клонування, отримання, надсилання й транспорт процесів SSH, а локальне читання й запис залишаться доступними.
Так, за замовчуванням хуки ввімкнено, і вони запускаються через proc_open(). Передайте ['hooks' => false] у Pitmaster::open(), Pitmaster::init() або Pitmaster::clone(), щоб пропустити скрипти в .git/hooks для цього дескриптора.
Pitmaster::clone(), fetch() і push() використовують SSH для URL-адрес SSH і smart HTTP в інших випадках; якщо smart-обмін не вдається, клонування й отримання переходять на dumb HTTP. SSH використовує розширення ssh2, якщо воно завантажене, а інакше — системний бінарний файл ssh.
Так. Передайте 'sha256' другим аргументом у Pitmaster::init() або запустіть init із параметром --object-format=sha256. Тоді для об’єктів використовуватимуться 64-символьні хеші.
Ні. Він відтворює частину команд git, зокрема log, status, diff, commit, merge, blame і grep. Клонування, отримання й надсилання доступні лише через PHP API.
Почніть із посібника для початку роботи, щоб відкрити перший репозиторій з PHP, а далі скористайтеся довідниками API і CLI.