Pitmaster
Git em PHP: leia e grave repositórios, compare diferenças, faça mesclagens e comunique-se pelo smart HTTP sem executar git pelo shell.
composer require pitmaster/pitmasterVersão mais recente 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/oldNa prática
Abra um repositório e, em seguida, leia-o e grave nele usando chamadas de métodos ou o shell.
Ler um repositório do PHP
Pitmaster::open() localiza o diretório .git e retorna um identificador de repositório. Cada entrada de status tem um estado separado para o índice e a árvore de trabalho.
No shell, ./vendor/bin/pitmaster reproduz um subconjunto dos comandos git e funciona em uma instalação de Composer, pois 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 featureSem binário do git
As operações principais são executadas em PHP 8.2+ sem binário do git nem FFI. Hooks e o fallback de SSH iniciam processos, a menos que você passe ['hooks' => false] ou processFreeOptions().
Leitura e gravação
Objetos soltos, arquivos pack com resolução de delta, o índice, referências e configuração. git lê o que Pitmaster grava nas versões 2 e 3 do índice e em referências soltas.
Diff e mesclagem
Diffs Myers, patience e histogram com detecção de renomeação. Mesclagem em três vias com marcadores de conflito.
Protocolo de rede
Clone, fetch e push pelo smart HTTP ou SSH, com fallback para HTTP dumb em clone e fetch. O protocolo v2 está disponível nos clientes de nível mais baixo.
Operações de Git
adicionar, confirmar, consultar status, comparar diferenças, mesclar, alternar branch, redefinir, guardar alterações, aplicar commits específicos, reverter, reorganizar commits, identificar autoria, pesquisar.
CLI
22 comandos no estilo git, incluindo init, log, status, diff, add, commit, branch, merge, stash, blame e grep. Clone, fetch e push estão disponíveis apenas pela biblioteca.
Testado pelo oráculo
Cenários 761 comparam os resultados com saídas capturadas de git real e são executados no CI; 605 vêm das suítes de teste do próprio git, de libgit2, go-git, isomorphic-git, dulwich e JGit.
Pesquisa completa
Blame, grep, bisect, notes e filtro de caminhos do log, sem executar git pelo shell.
Por que Pitmaster
Funciona sem instalar git
Commits, diffs, status e histórico são calculados em PHP, então contêineres e hosts sem o binário git ainda podem trabalhar com repositórios.
Identificadores sem processos
Pitmaster::processFreeOptions() desativa hooks, hooks de fsmonitor, clone, fetch, push e o transporte de processos de SSH. Leituras e gravações locais continuam funcionando.
Verificado em comparação com git
Os testes de integração são executados com o binário git, e a matriz de suporte contabiliza 146 dos recursos de 146 dentro do escopo como verificados pelo oráculo dentro do escopo de paridade declarado.
SHA-1 e SHA-256
Crie um repositório SHA-256 com Pitmaster::init($path, 'sha256') ou use init --object-format=sha256. Arquivos pack são lidos e gravados; arquivos commit-graph, multi-pack index e reftable podem ser lidos.
Comparação com
Outras formas de trabalhar com repositórios Git a partir de PHP, e as diferenças de Pitmaster.
| Ferramenta | Ideal para | Diferenças em relação a Pitmaster |
|---|---|---|
| git (linha de comando) | Ideal paraA implementação de referência, com um conjunto amplo de comandos que abrange operações de alto nível e acesso completo aos componentes internos. | Diferenças em relação a PitmasterPitmaster é executado dentro do processo PHP, e as operações principais não executam git pelo shell. Sua CLI reproduz apenas um subconjunto dos comandos git. |
| czproject/git-php | Ideal paraUm PHP API compacto para init, clone, commit, merge, branches, tags e remotes. Funciona no PHP 8.0 ou posterior e usa o cliente git instalado. | Diferenças em relação a PitmasterPitmaster não precisa do cliente git para as operações principais, pois lê e grava objetos, arquivos pack e o índice por conta própria. Requer PHP 8.2 ou posterior. |
| gitonomy/gitlib | Ideal paraAcesso a repositórios a partir do PHP 8.4 ou posterior, sem precisar compilar nada. Funciona fazendo chamadas de shell para git. | Diferenças em relação a PitmasterPitmaster não faz chamadas de shell nas operações principais, e um identificador sem processos desativa as partes que iniciariam um processo. |
| libgit2 | Ideal paraUma implementação portável em C dos métodos principais de Git como biblioteca vinculável, com bindings para Ruby, .NET, Python, Node.js, Rust e outros. | Diferenças em relação a PitmasterPitmaster é um PHP simples, instalado com Composer, sem biblioteca compilada nem FFI. Importa 63 cenários do oráculo dos recursos de teste de libgit2. |
Perguntas e respostas
Respostas curtas da documentação do Pitmaster.
Não. As operações principais de repositório não usam o binário git nem FFI. Objetos, referências, arquivos pack, o índice e o smart HTTP são processados em PHP.
Sim. Passe Pitmaster::processFreeOptions() ou ['processes' => false] ao abrir o repositório. Hooks, clone, fetch, push e o transporte de processos de SSH serão desativados, enquanto as leituras e gravações locais continuarão disponíveis.
Sim, os hooks ficam ativados por padrão e são executados por proc_open(). Passe ['hooks' => false] para Pitmaster::open(), Pitmaster::init() ou Pitmaster::clone() para ignorar os scripts em .git/hooks para esse identificador.
Pitmaster::clone(), fetch() e push() usam SSH para URLs SSH e smart HTTP nos demais casos; clone e fetch recorrem ao HTTP dumb quando a troca smart falha. SSH usa a extensão ssh2 quando ela está carregada e o binário ssh do sistema nos demais casos.
Sim. Passe 'sha256' como segundo argumento para Pitmaster::init() ou execute init com --object-format=sha256. Os objetos passarão a usar hashes de 64 caracteres.
Não. Ele reproduz um subconjunto dos comandos git, como log, status, diff, commit, merge, blame e grep. Clone, fetch e push estão disponíveis apenas pela PHP API.
Comece pelo guia de introdução para abrir seu primeiro repositório a partir de PHP; depois, consulte as referências de API e CLI para o restante.