PHP Stream Wrapper for Git

2025-12-07 0 981

PHP的GIT流包装

PHP的GIT流包装器是PHP库,允许PHP代码与应用程序内部的一个或多个GIT存储库进行交互。该库由GIT存储库抽象组成,该抽象可用于编程访问GIT存储库和流包装器,该流程包装器可以挂载到PHP流基础架构中,以允许开发人员在GIT存储库中的文件上直接使用文件和目录访问功能。该库提供了访问GIT存储库的状态信息的方法,例如日志,当前存储库状态或提交信息。

PHP Core的GIT流包装器是围绕GIT命令行二进制的包装器,因此需要在运行PHP代码的机器上安装GIT。 PHP的GIT流包装器不包括GIT协议抽象,它依赖于Git命令行二进制的所有功能。

该代码当前正在运行稳定(请参阅下面的Windows上的注释),应为API稳定。但是,它不是完整的 – 因此,请随时请求您需要的功能。

例子

使用存储库抽象

 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.
});

使用StreamWrapper

 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 <skywalker@deathstar.com> \'
    )
));
$ 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 <skywalker@deathstar.com> \'
    )
));
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 ();

要求

  • PHP> = 8.0.0
  • 作曲家可包括依赖项
  • 在运行PHP代码的机器上安装了GIT
  • 如果要使用SVN组件,则在运行PHP代码的机器上安装了SVN

运行测试

  1. 克隆存储库
  2. 运行composer install以安装依赖项并创建自动加载器
  3. 复制phpunit.xml.distphpunit.xml
  4. phpunit.xml中的GIT_BINARYSVN_BINARYSVN_ADMIN_BINARY常数调整到git二进制的路径
  5. 从克隆的项目文件夹中运行phpunit

请注意,该库已在Mac OS X 12.6上进行了测试,其中包含捆绑的PHP 8.0.27、8.1.14和8.2.1(GIT版本2.39.1)和几个Ubuntu Linux安装。由于目前未知原因,该测试在Windows上运行有些不稳定。所有测试均应为绿色,但是在清理过程中,可能会有一些访问限制随机启动并防止清理代码删除测试目录。

单位测试套件在PHP 8.0、8.1、8.2和8.3上的GITHUB操作不断测试,其当前状态为:

贡献

请随时使用GIT问题跟踪来报告任何问题或错误。如果您想积极地开发图书馆,则鼓励您克隆存储库并发送拉动请求。

执照

Teqneers GmbH&Co。KG版权(C)2023

特此免费获得许可,免费授予任何获得此软件副本和相关文档文件(“软件”)的人,以无限制地处理软件,包括无限制的使用权,复制,复制,修改,合并,发布,分发,分发,分发,分配,sublicense和/或允许软件允许与以下条件相关的软件,以下是以下条件。

上述版权通知和此许可通知应包含在软件的所有副本或大量部分中。

该软件是“原样”提供的,没有任何形式的明示或暗示保证,包括但不限于适销性,特定目的的适用性和非侵权的保证。在任何情况下,作者或版权持有人都不应对任何索赔,损害赔偿或其他责任责任,无论是在合同,侵权的诉讼中还是其他责任,是由软件,使用或与软件中的使用或其他交易有关的。

下载源码

通过命令行克隆项目:

git clone https://github.com/teqneers/PHP-Stream-Wrapper-for-Git.git

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

申明:本文由第三方发布,内容仅代表作者观点,与本网站无关。对本文以及其中全部或者部分内容的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。本网发布或转载文章出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,也不代表本网对其真实性负责。

左子网 开发教程 PHP Stream Wrapper for Git https://www.zuozi.net/31932.html

DNTIdentity
上一篇: DNTIdentity
asyncgi
下一篇: asyncgi
常见问题
  • 1、自动:拍下后,点击(下载)链接即可下载;2、手动:拍下后,联系卖家发放即可或者联系官方找开发者发货。
查看详情
  • 1、源码默认交易周期:手动发货商品为1-3天,并且用户付款金额将会进入平台担保直到交易完成或者3-7天即可发放,如遇纠纷无限期延长收款金额直至纠纷解决或者退款!;
查看详情
  • 1、描述:源码描述(含标题)与实际源码不一致的(例:货不对板); 2、演示:有演示站时,与实际源码小于95%一致的(但描述中有”不保证完全一样、有变化的可能性”类似显著声明的除外); 3、发货:不发货可无理由退款; 4、安装:免费提供安装服务的源码但卖家不履行的; 5、收费:价格虚标,额外收取其他费用的(但描述中有显著声明或双方交易前有商定的除外); 6、其他:如质量方面的硬性常规问题BUG等。 注:经核实符合上述任一,均支持退款,但卖家予以积极解决问题则除外。
查看详情
  • 1、左子会对双方交易的过程及交易商品的快照进行永久存档,以确保交易的真实、有效、安全! 2、左子无法对如“永久包更新”、“永久技术支持”等类似交易之后的商家承诺做担保,请买家自行鉴别; 3、在源码同时有网站演示与图片演示,且站演与图演不一致时,默认按图演作为纠纷评判依据(特别声明或有商定除外); 4、在没有”无任何正当退款依据”的前提下,商品写有”一旦售出,概不支持退款”等类似的声明,视为无效声明; 5、在未拍下前,双方在QQ上所商定的交易内容,亦可成为纠纷评判依据(商定与描述冲突时,商定为准); 6、因聊天记录可作为纠纷评判依据,故双方联系时,只与对方在左子上所留的QQ、手机号沟通,以防对方不承认自我承诺。 7、虽然交易产生纠纷的几率很小,但一定要保留如聊天记录、手机短信等这样的重要信息,以防产生纠纷时便于左子介入快速处理。
查看详情

相关文章

猜你喜欢
发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务