有没有很好的支持 http 的 php git 客户端?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/9284283/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 06:29:06  来源:igfitidea点击:

Is there a good php git client with http support?

phpgithttpclient-library

提问by Radmilla Mustafa

For a project I am working on, we want to use git as a revision tracker for certain data we modify often. We are using php for the web frontend and we need a goo php git client to use. I have come across a handful on the internet and they all tend to have the same limitation...

对于我正在从事的项目,我们希望使用 git 作为我们经常修改的某些数据的修订跟踪器。我们在 Web 前端使用 php,我们需要一个 goo php git 客户端来使用。我在互联网上遇到过一些,他们都倾向于有相同的限制......

There is no support for HTTP. We need to be able to push/pull to remote repositories. We also need to clone.

不支持 HTTP。我们需要能够推/拉到远程存储库。我们还需要克隆。

Ideally I am looking for something that does not use the git command (ie: wrapers to exec()) but I am willing to settle if the class works well. I have seen a C library which appears to do what I want, however the php language binding is incomplete and the http functions are labeled experimental.

理想情况下,我正在寻找不使用 git 命令的东西(即:包装到 exec()),但我愿意解决该类是否运行良好。我见过一个 C 库,它似乎可以满足我的要求,但是 php 语言绑定不完整,并且 http 函数被标记为实验性的。

Does anyone have any insight into using git and http through php?

有没有人对通过 php 使用 git 和 http 有任何见解?

回答by kbjr

https://github.com/kbjr/Git.php

https://github.com/kbjr/Git.php

Git.php is a wrapper class around git calls that uses proc_openinstead of execto run the commands. While it does not have push/pull methods, it does have a general runmethod for running custom git commands, so it could be used something like this:

Git.php 是一个围绕 git 调用的包装类,它使用proc_open而不是exec运行命令。虽然它没有推/拉方法,但它确实有一个run运行自定义 git 命令的通用方法,所以它可以像这样使用:

$repo = Git::open('/path/to/repo');
$repo->run('push origin master');

It also does have methods for cloning (clone_toand clone_fromwhich do local cloning and clone_remotefor remote cloning).

它还具有克隆方法(clone_to以及clone_from进行本地克隆和clone_remote远程克隆)。

回答by scipilot

One possibility is to use PHP's SSH library to perform those actions by connecting back to the web server?

一种可能性是使用 PHP 的 SSH 库通过连接回 Web 服务器来执行这些操作?

Or I found this set of classeswhich allow you to you to clone and read other metadata over HTTP, but not push nor pull. However it could be a starting point if you're brave enough to extend them to do that. I can imagine it would be a lot of work to replicate these processes and keep them compliant with various server versions etc.

或者我发现了这组类,它们允许您通过 HTTP 克隆和读取其他元数据,但不能推送或拉取。但是,如果您有足够的勇气扩展它们来做到这一点,这可能是一个起点。我可以想象复制这些过程并让它们与各种服务器版本等兼容需要做很多工作。

[UPDATED 23/03/2014, after receiving an upvote - thanks!]

[2014 年 3 月 23 日更新,收到投票后 - 谢谢!]

I did get some way trying to implement the above (I was searching for an implementation, drew a blank so tried to write my own), and it washard as I thought! I actually abandoned it as I found a simpler way to achieve this in a different architecture, but here's the class I wrote trying. It essentially works, but was brittle to the environmental variations I was working in (i.e. it doesn't cope very well with errors or problems).

我没有得到某种方式设法实现上述(我正在寻找一个实现,所以画了试图写我自己的一个空白),这因为我以为很难!我实际上放弃了它,因为我找到了一种更简单的方法来在不同的架构中实现这一点,但这是我尝试编写的类。它本质上是有效的,但对我工作的环境变化来说很脆弱(即它不能很好地应对错误或问题)。

It uses:

它用:

  1. herzult/php-ssh
  2. an ssh config file - a trick to simplify setting up authentication credentials in code
  1. Herzult/php-ssh
  2. 一个 ssh 配置文件 - 一种简化在代码中设置身份验证凭据的技巧

(Note - I had to quickly strip out a few details from the code to post it. So you'll need to fiddle about a bit to integrate it into your app/namespace etc.)

(注意 - 我必须快速从代码中删除一些细节才能发布它。所以你需要稍微调整一下以将它集成到你的应用程序/命名空间等中。)

<?php
/**
 * @author: scipilot
 * @since: 31/12/2013
 */

/**
 * Class GitSSH allows you to perform Git functions over an SSH session.
 * i.e. you are using the command-line Git commands after SSHing to a host which has the Git client.
 *
 * You don't need to know about the SSH to use the class, other than the fact you will need access
 * to a server via SSH which has the Git client installed. Its likely this is the local web server.
 *
 * This was made because PHP has no good native Git client.
 *
 * Requires herzult/php-ssh
 *
 * Example php-ssh config file would be
 *
 * <code>
 *  Host localhost
 *  User git
 *  IdentityFile id_rsa
 *
 *  Host your.host.domain.com
 *  User whoever
 *  IdentityFile ~/.ssh/WhoeverGit
 *</code>
 */
class GitSSH {
    protected $config;
    protected $session;
    protected $sPath;
    /**
     * @var string
     */
    protected $sConfigPath = '~/.ssh/config';

    /**
     * Connects to the specified host, ready for further commands.
     *
     * @param string $sHost         Host (entry in the config file) to connect to.
     * @param string $sConfigPath Optional; config file path. Defaults to ~/.ssh/config,
     *                            which is probably inaccessible for web apps.
     */
    function __construct($sHost, $sConfigPath=null){
        \Log::info('New GitSSH '.$sHost.', '.$sConfigPath);
        if(isset($sConfigPath)) $this->sConfigPath = $sConfigPath;

        $this->config = new \Ssh\SshConfigFileConfiguration($this->sConfigPath, $sHost);
        $this->session = new \Ssh\Session($this->config, $this->config->getAuthentication());
    }

    public function __destruct() {
        $this->disconnect();
    }

    /**
     * Thanks to Steve Kamerman, as there isn't a native disconnect.
     */
    public function disconnect() {
        $this->exec('echo "EXITING" && exit;');
        $this->session = null;
    }

    /**
     * Run a command (in the current working directory set by cd)
     * @param $sCommand
     * @return string
     */
    protected function exec($sCommand) {
        //echo "\n".$sCommand."\n";
        $exec = $this->session->getExec();
        $result = $exec->run('cd '.$this->sPath.'; '.$sCommand);
        // todo: parse/scrape the result, return a Result object?
        return $result;
    }

    /**
     * CD to a folder. (This not an 'incremental' cd!)
     * Devnote: we don't really execute the cd now, it's appended to other commands. Each command seems to re-login?
     *
     * @param string $sPath Absolute filesystem path, or relative from user home
     */
    public function cd($sPath){
        $this->sPath = $sPath;

        // @todo this is useless! each command seems to run in a separate login?
        //$result = $this->exec('cd'); // /; ls');
        //return $result;
    }

    /**
     * @return string
     */
    public function ls(){
        $result = $this->exec('ls ');

        return $result;
    }

    public function gitAdd($sOptions=null, array $aFiles=null){
        $result = $this->exec('git add '
            .(empty($sOptions) ? '' : ' '.$sOptions)
            .(empty($aFiles) ? '' : ' '.implode(' ', $aFiles))
        );

        return $result;
    }

    public function gitClone($sRepo, $sBranch=null, $sTarget=null){
        \Log::info('GitSSH::clone '.$sRepo.', '.$sBranch.', '.$sTarget);
        $result = $this->exec('git clone '
            .(empty($sBranch) ? '' : ' --branch '.$sBranch)
            .' '.$sRepo
            .' '.$sTarget);

        return $result;
    }

    public function gitCommit($sMessage, $sOptions=null, array $aFiles=null){
        $result = $this->exec('git commit '
            .'-m "'.addcslashes($sMessage, '"').'"'
            .(empty($sOptions) ? '' : ' '.$sOptions)
            .(empty($aFiles) ? '' : ' '.implode(' ', $aFiles))
        );

        return $result;
    }

    public function gitPull($sOptions=null, $sRepo=null, $sRefspec=null){
        $result = $this->exec('git pull '
            .(empty($sOptions) ? '' : ' '.$sOptions)
            .(empty($sRepo) ? '' : ' '.$sRepo)
            .(empty($sRefspec) ? '' : ' '.$sRefspec)
        );

        return $result;
    }

    public function gitPush($sOptions=null, $sRepo=null, $sRefspec=null){
        $result = $this->exec('git push '
            .(empty($sOptions) ? '' : ' '.$sOptions)
            .(empty($sRepo) ? '' : ' '.$sRepo)
            .(empty($sRefspec) ? '' : ' '.$sRefspec)
        );

        return $result;
    }

    /**
     * @return string the raw result from git status
     */
    public function gitStatus(){
        $result = $this->exec('git status');
        return $result;
    }

}

回答by Patrick

This looks promising: http://gitphp.org(broken link; see an archived version)

这看起来很有希望:http: //gitphp.org(断开的链接;查看存档版本

I think that will do it for you. Here is the description of it:

我想这会为你做的。这是它的描述:

GitPHP is a web frontend for git repositories. It emulates the look of standard gitweb, but is written in PHP and makes use of Smarty templates for customization. It has a couple extras, including syntax highlighting through the GeSHi PHP class and project category support. It works with standard git as well as msysgit on Windows.

Setup should be fairly simple – just extract the tarball where you want to install it, copy config/gitphp.conf.php.example to config/gitphp.conf.php, and set the projectroot in the conf to point to your directory where your bare git repositories are, and make the templates_c directory writeable by the webserver if it's not already. You can look through all the available options and defaults in config/gitphp.conf.defaults.php, and copy an option into your config file if you want to override the default. You can also copy config/projects.conf.php.example to config/projects.conf.php and edit it if you want more advanced control over your projects, such as defining categories for projects or loading projects from a text file. More detailed instructions are in the included README.

Note: if you're upgrading your existing gitphp.conf.php will not be overwritten, but I recommend checking gitphp.conf.defaults.php for new configuration options that may have been added.

You can view the live copy running on this site.

GitPHP 是 git 存储库的 Web 前端。它模仿标准 gitweb 的外观,但用 PHP 编写并使用 Smarty 模板进行自定义。它有一些附加功能,包括通过 GeSHi PHP 类和项目类别支持的语法突出显示。它适用于标准 git 以及 Windows 上的 msysgit。

安装应该相当简单——只需解压缩你想要安装它的 tarball,将 config/gitphp.conf.php.example 复制到 config/gitphp.conf.php,然后在 conf 中设置 projectroot 指向你的目录裸 git 存储库是,并且使 templates_c 目录可由网络服务器写入(如果尚未写入)。您可以查看 config/gitphp.conf.defaults.php 中的所有可用选项和默认值,如果您想覆盖默认值,请将一个选项复制到您的配置文件中。您还可以将 config/projects.conf.php.example 复制到 config/projects.conf.php 并编辑它,如果您想对项目进行更高级的控制,例如定义项目类别或从文本文件加载项目。更详细的说明在包含的自述文件中。

注意:如果您正在升级现有的 gitphp.conf.php 不会被覆盖,但我建议检查 gitphp.conf.defaults.php 以获取可能已添加的新配置选项。

您可以查看在此站点上运行的实时副本。