Pitmaster
Git en PHP: lee y escribe repositorios, calcula diferencias, fusiona y se comunica mediante HTTP inteligente sin invocar git desde la línea de comandos.
composer require pitmaster/pitmasterÚltima versión 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/oldEn la práctica
Abre un repositorio y luego léelo y modifícalo con llamadas a métodos o desde la línea de comandos.
Lee un repositorio desde PHP
Pitmaster::open() localiza el directorio .git y devuelve un manejador del repositorio. Cada entrada de estado tiene un estado independiente para el índice y el árbol de trabajo.
Desde la línea de comandos, ./vendor/bin/pitmaster replica un subconjunto de los comandos de git y funciona con una instalación Composer, ya que 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 featureSin binario de git
Las operaciones principales se ejecutan en PHP 8.2+ sin binario de git ni FFI. Los hooks y el modo alternativo de SSH inician procesos, salvo que pases ['hooks' => false] o processFreeOptions().
Lectura y escritura
Objetos sueltos, archivos pack con resolución de deltas, el índice, las referencias y la configuración. git lee lo que escribe Pitmaster para las versiones 2 y 3 del índice y las referencias sueltas.
Diferencias y fusiones
Diferencias con Myers, patience e histogram, y detección de renombrados. Fusión de tres vías con marcadores de conflicto.
Protocolo de red
Clona, obtiene y envía cambios mediante HTTP o SSH inteligente, con un modo alternativo HTTP simple para clonar y obtener cambios. El protocolo v2 está disponible mediante los clientes de nivel inferior.
Operaciones Git
añadir, confirmar, consultar el estado, comparar cambios, fusionar, cambiar de rama, restablecer, guardar cambios temporalmente, aplicar confirmaciones seleccionadas, revertir, reorganizar el historial, consultar quién modificó cada línea, buscar.
CLI
22 comandos al estilo de git, incluidos init, log, status, diff, add, commit, branch, merge, stash, blame y grep. Clonar, obtener y enviar cambios solo está disponible en la biblioteca.
Probado con oráculo
761 escenarios comparan los resultados con salidas capturadas de git real y se ejecutan en CI; 605 proceden de las suites de pruebas de git, libgit2, go-git, isomorphic-git, dulwich y JGit.
Búsqueda completa
Blame, grep, bisect, notas y filtro de rutas del registro, sin invocar git desde la línea de comandos.
Por qué Pitmaster
Funciona sin instalar git
Los commits, las diferencias, el estado y el historial se calculan en PHP, así que los contenedores y servidores sin un binario de git pueden trabajar con repositorios.
Manejadores sin procesos
Pitmaster::processFreeOptions() desactiva los hooks, los hooks de fsmonitor, clone, fetch, push y el transporte de procesos SSH. Las lecturas y escrituras locales siguen funcionando.
Verificado con git
Las pruebas de integración se ejecutan con el binario git, y la matriz de compatibilidad contabiliza 146 de las funciones incluidas en el alcance de 146 como verificadas mediante un oráculo, dentro del alcance de paridad declarado.
SHA-1 y SHA-256
Cree un repositorio SHA-256 con Pitmaster::init($path, 'sha256') o init --object-format=sha256. Los archivos de paquete se leen y escriben; los archivos commit-graph, multi-pack index y reftable se pueden leer.
Comparación con
Otras formas de trabajar con repositorios Git desde PHP y en qué se diferencia Pitmaster.
| Herramienta | Ideal para | Diferencia con Pitmaster |
|---|---|---|
| git (línea de comandos) | Ideal paraLa implementación de referencia, con un amplio conjunto de comandos que abarca tanto operaciones de alto nivel como acceso completo a los componentes internos. | Diferencia con PitmasterPitmaster se ejecuta dentro del proceso PHP y las operaciones principales no llaman a git desde la shell. Su CLI solo reproduce un subconjunto de los comandos de git. |
| czproject/git-php | Ideal paraUn PHP API compacto para init, clone, commit, merge, ramas, etiquetas y repositorios remotos. Se ejecuta en PHP 8.0 o posterior y utiliza el cliente git instalado. | Diferencia con PitmasterPitmaster no necesita un cliente git para las operaciones principales, porque lee y escribe los objetos, los archivos de paquete y el índice directamente. Requiere PHP 8.2 o posterior. |
| gitonomy/gitlib | Ideal paraAcceso a repositorios desde PHP 8.4 o posterior, sin necesidad de compilar nada. Funciona mediante llamadas a git desde la shell. | Diferencia con PitmasterPitmaster no realiza llamadas a la shell para las operaciones principales, y un controlador sin procesos desactiva las partes que iniciarían un proceso. |
| libgit2 | Ideal paraImplementación portable en C de los métodos principales de Git como biblioteca enlazable, con enlaces para Ruby, .NET, Python, Node.js, Rust y más. | Diferencia con PitmasterPitmaster es PHP puro, instalado con Composer, sin biblioteca compilada ni FFI. Importa 63 de sus escenarios de oráculo de los recursos de prueba de libgit2. |
Fuentes, marcado
Preguntas y respuestas
Respuestas breves de la documentación de Pitmaster.
No. Las operaciones principales del repositorio no usan el binario de git ni FFI. Los objetos, las referencias, los archivos de paquete, el índice y el protocolo smart HTTP se gestionan en PHP.
Sí. Pase Pitmaster::processFreeOptions() o ['processes' => false] al abrir el repositorio. Así se desactivan los hooks, clone, fetch, push y el transporte de procesos SSH, mientras que las lecturas y escrituras locales siguen disponibles.
Sí, los hooks están activados de forma predeterminada y se ejecutan mediante proc_open(). Pase ['hooks' => false] a Pitmaster::open(), Pitmaster::init() o Pitmaster::clone() para omitir los scripts de .git/hooks en ese controlador.
Pitmaster::clone(), fetch() y push() usan SSH para las URL SSH y smart HTTP en los demás casos; clone y fetch recurren a dumb HTTP si falla el intercambio smart. SSH usa la extensión ssh2 cuando está cargada y, en caso contrario, el binario ssh del sistema.
Sí. Pase 'sha256' como segundo argumento a Pitmaster::init() o ejecute init con --object-format=sha256. Los objetos usarán entonces hashes de 64 caracteres.
No. Reproduce un subconjunto de los comandos de git, como log, status, diff, commit, merge, blame y grep. Clone, fetch y push solo están disponibles mediante PHP API.
Empiece con la guía de inicio para abrir su primer repositorio desde PHP y luego consulte las referencias de API y CLI para lo demás.