Git Stream Wrapper para PHP es una biblioteca PHP que permite que el código PHP interactúe con uno o varios repositorios Git desde una aplicación. La biblioteca consta de una abstracción del repositorio Git que se puede utilizar para acceder mediante programación a los repositorios Git y de un contenedor de secuencias que se puede conectar a la infraestructura de secuencias de PHP para permitir al desarrollador utilizar funciones de acceso a archivos y directorios directamente en los archivos de un repositorio Git. La biblioteca también proporciona medios para acceder a la información de estado en un repositorio Git, como el registro, el estado actual del repositorio o la información de confirmación.
El núcleo de Git Stream Wrapper para PHP es un contenedor alrededor del binario de línea de comando de Git, por lo que es necesario tener Git instalado en la máquina que ejecuta el código PHP. Git Stream Wrapper para PHP no incluye una abstracción del protocolo Git , se basa en el binario de la línea de comandos de Git para toda su funcionalidad.
Actualmente, el código se ejecuta de forma estable (consulte los comentarios sobre Windows a continuación) y debería ser estable en API. Sin embargo, no incluye todas las funciones, así que no dude en solicitar las funciones que necesite.
use TQ Git Repository Repository ;
// open an already initialized repository
$ git = Repository:: open ( ' /path/to/your/repository ' , ' /usr/bin/git ' );
// open repository and create path and init repository if necessary
$ git = Repository:: open ( ' /path/to/your/repository ' , ' /usr/bin/git ' , 0755 );
// get current branch
$ branch = $ git -> getCurrentBranch ();
// get status of working directory
$ status = $ git -> getStatus ();
// are there uncommitted changes in the staging area or in the working directory
$ isDirty = $ git -> isDirty ();
// retrieve the commit log limited to $limit entries skipping the first $skip
$ log = $ git -> getLog ( $ limit , $ skip );
// retrieve the second to last commit
$ commit = $ git -> showCommit ( ' HEAD^ ' );
// list the directory contents two commits before
$ list = $ git -> listDirectory ( ' . ' , ' HEAD^^ ' );
// show contents of file $file at commit abcd123...
$ contents = $ git -> showFile ( $ file , ' abcd123 ' );
// write a file and commit the changes
$ commit = $ git -> writeFile ( ' test.txt ' , ' Test ' , ' Added test.txt ' );
// remove multiple files
$ commit = $ git -> removeFile ( ' file_* ' , ' Removed all files not needed any more ' );
// rename a file
$ commit = $ c -> renameFile ( ' test.txt ' , ' test.txt-old ' , ' Made a backup copy ' );
// do some file operations and commit all changes at once
$ result = $ git -> transactional ( function ( TQ Vcs Repository Transaction $ t ) {
file_put_contents ( $ t -> getRepositoryPath (). ' /text1.txt ' , ' Test 1 ' );
file_put_contents ( $ t -> getRepositoryPath (). ' /text2.txt ' , ' Test 2 ' );
unlink ( $ t -> resolvePath ( ' old.txt ' ));
rename ( $ t -> resolvePath ( ' to_keep.txt ' ), $ t -> resolvePath ( ' test3.txt ' ));
$ t -> setCommitMsg ( ' Don ' t know what to write here ' );
// if we throw an exception from within the callback the changes are discarded
// throw new Exception('No we don't want to make these changes');
// note: the exception will be re-thrown by the repository so you have to catch
// the exception yourself outside the transactional scope.
});
use TQ Git StreamWrapper StreamWrapper ;
// register the wrapper
StreamWrapper:: register ( ' git ' , ' /usr/bin/git ' );
// read the contents of a file
$ content = file_get_contents ( ' git:///path/to/your/repository/file_0.txt ' );
// show contents of a file at commit abcd123...
$ content = file_get_contents ( ' git:///path/to/your/repository/file_0.txt#abcd123 ' );
// show contents of a file two commits before
$ content = file_get_contents ( ' git:///path/to/your/repository/file_0.txt#HEAD^^ ' );
// show the directory information two commits before
$ directory = file_get_contents ( ' git:///path/to/your/repository/#HEAD^^ ' );
// list directory contents two commits before
$ dir = opendir ( ' git:///path/to/your/repository/subdir#HEAD^^ ' );
while ( $ f = readdir ( $ dir )) {
echo $ f . PHP_EOL ;
}
closedir ( $ dir );
// recursively traverse the repository two commits before
$ dir = new RecursiveDirectoryIterator ( ' git:///path/to/your/repository#HEAD^^ ' );
$ it = new RecursiveIteratorIterator ( $ dir , RecursiveIteratorIterator:: SELF_FIRST );
foreach ( $ it as $ fileInfo ) {
echo str_repeat ( ' ' , $ it -> getDepth () * 3 ). $ fileInfo -> getFilename (). PHP_EOL ;
}
// retrieve the second to last commit
$ commit = file_get_contents ( ' git:///path/to/your/repository?commit&ref=HEAD^^ ' );
// retrieve the commit log limited to 5entries skipping the first 2
$ log = file_get_contents ( ' git:///path/to/your/repository?log&limit=5&skip=2 ' );
// remove a file - change is committed to the repository
unlink ( ' git:///path/to/your/repository/file_to_delete.txt ' );
// rename a file - change is committed to the repository
rename ( ' git:///path/to/your/repository/old.txt ' , ' git:///path/to/your/repository/new.txt ' );
// remove a directory - change is committed to the repository
rmdir ( ' git:///path/to/your/repository/directory_to_delete ' );
// create a directory - change is committed to the repository
// this creates a .gitkeep file in new_directory because Git does not track directories
mkdir ( ' git:///path/to/your/repository/new_directory ' );
// write to a file - change is committed to the repository when file is closed
$ file = fopen ( ' git:///path/to/your/repository/test.txt ' , ' w ' );
fwrite ( $ file , ' Test ' );
fclose ( $ file );
// support for stream context
$ context = stream_context_create ( array (
' git ' => array (
' commitMsg ' => ' Hello World ' ,
' author ' => ' Luke Skywalker <[email protected]> '
)
));
$ file = fopen ( ' git:///path/to/your/repository/test.txt ' , ' w ' , false , $ context );
fwrite ( $ file , ' Test ' );
fclose ( $ file ); // file gets committed with the preset commit message and author
// append to a file using file_put_contents using a custom author and commit message
$ context = stream_context_create ( array (
' git ' => array (
' commitMsg ' => ' Hello World ' ,
' author ' => ' Luke Skywalker <[email protected]> '
)
));
file_put_contents ( ' git:///path/to/your/repository/test.txt ' , ' Test ' , FILE_APPEND , $ context );
// it is now possible to register repository-specific paths on the stream wrapper
StreamWrapper:: getRepositoryRegistry ()-> addRepositories (
array (
' repo1 ' => Repository:: open ( ' /path/to/repository/1 ' , ' /usr/bin/git ' , false ),
' repo2 ' => Repository:: open ( ' /path/to/repository/2 ' , ' /usr/bin/git ' , false ),
)
);
$ content1 = file_get_contents ( ' git://repo1/file_0.txt ' );
$ content2 = file_get_contents ( ' git://repo2/file_0.txt ' );
// unregister the wrapper if needed
StreamWrapper:: unregister ();
composer install
para instalar las dependencias y crear el cargador automáticophpunit.xml.dist
a phpunit.xml
GIT_BINARY
, SVN_BINARY
y SVN_ADMIN_BINARY
en phpunit.xml
a la ruta a su binario Gitphpunit
desde la carpeta del proyecto clonadoTenga en cuenta que la biblioteca ha sido probada en Mac OS X 12.6 con PHP 8.0.27, 8.1.14 y 8.2.1 (versión git 2.39.1) y en varias instalaciones de Ubuntu Linux. Debido a razones actualmente desconocidas, la prueba se ejecuta un poco inestable en Windows. Todas las pruebas deben estar en verde , pero durante la limpieza puede existir la posibilidad de que algunas restricciones de acceso se activen aleatoriamente e impidan que el código de limpieza elimine los directorios de prueba.
El conjunto de pruebas unitarias se prueba continuamente con GitHub Actions en PHP 8.0, 8.1, 8.2 y 8.3 y su estado actual es:
No dude en utilizar el seguimiento de problemas de Git para informar cualquier problema o error. Le recomendamos clonar el repositorio y enviar solicitudes de extracción si desea contribuir activamente en el desarrollo de la biblioteca.
Copyright (C) 2023 de TEQneers GmbH & Co. KG
Por el presente se otorga permiso, sin cargo, a cualquier persona que obtenga una copia de este software y los archivos de documentación asociados (el "Software"), para operar con el Software sin restricciones, incluidos, entre otros, los derechos de uso, copia, modificación, fusión. , publicar, distribuir, sublicenciar y/o vender copias del Software, y permitir que las personas a quienes se les proporciona el Software lo hagan, sujeto a las siguientes condiciones:
El aviso de derechos de autor anterior y este aviso de permiso se incluirán en todas las copias o partes sustanciales del Software.
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA, INCLUYENDO, PERO NO LIMITADO A, LAS GARANTÍAS DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN. EN NINGÚN CASO LOS AUTORES O TITULARES DE DERECHOS DE AUTOR SERÁN RESPONSABLES DE NINGÚN RECLAMO, DAÑO U OTRA RESPONSABILIDAD, YA SEA EN UNA ACCIÓN CONTRACTUAL, AGRAVIO O DE OTRA MANERA, QUE SURJA DE, FUERA DE O EN RELACIÓN CON EL SOFTWARE O EL USO U OTRAS NEGOCIOS EN EL SOFTWARE.