Pitmaster
Git для работы с PHP: чтение и запись репозиториев, сравнение изменений, слияние и работа со смарт-протоколом 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-файлы с разрешением дельт, индекс, ссылки и конфигурация. git читает то, что записывает Pitmaster, для версий индекса 2 и 3, а также свободных ссылок.
Сравнение и слияние
Алгоритмы сравнения Myers, patience и histogram с обнаружением переименований. Трёхстороннее слияние с маркерами конфликтов.
Сетевой протокол
Клонирование, получение и отправка данных по смарт-протоколу HTTP или SSH; для клонирования и получения данных предусмотрен резервный вариант с простым протоколом 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
Коммиты, различия, состояние и история вычисляются в 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-файлы, индекс и смарт-протокол 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 и смарт-протокол HTTP в остальных случаях. Если обмен по смарт-протоколу не удаётся, клонирование и получение данных переходят на простой протокол 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.