Есть ли хороший клиент php git с поддержкой HTTP?

Для проекта, над которым я работаю, мы хотим использовать git в качестве отслеживания изменений для некоторых данных, которые мы часто изменяем. Мы используем php для веб-интерфейса, и нам нужен клиент goo php git. Я столкнулся с горсткой в ​​Интернете, и все они имеют одинаковое ограничение...

Поддержка HTTP отсутствует. Нам нужно иметь возможность нажимать/удалять удаленные репозитории. Нам также нужно клонировать.

В идеале я ищу что-то, что не использует команду git (то есть: wrapers to exec()), но я готов решить, хорошо ли класс работает. Я видел библиотеку C, которая, кажется, делает то, что я хочу, однако привязка языка php является неполной, а функции http обозначены экспериментальными.

Есть ли у кого-нибудь понимание использования git и http через php?

Ответ 1

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

Git.php - это класс оболочки вокруг вызовов git, который использует proc_open вместо exec для запуска команд. Хотя у него нет методов push/pull, у него есть общий run метод для выполнения пользовательских команд git, поэтому его можно использовать примерно так:

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

Он также имеет методы клонирования (clone_to и clone_from, которые выполняют локальное клонирование и clone_remote для удаленного клонирования).

Ответ 2

Можно ли использовать PHP SSH-библиотеку для выполнения этих действий путем подключения к веб-серверу?

Или я нашел этот набор классов, который позволяет вам клонировать и читать другие метаданные по HTTP, но не нажимать и не тянуть. Однако это может быть отправной точкой, если вы достаточно храбр, чтобы расширить их, чтобы сделать это. Я могу себе представить, что было бы много работы по репликации этих процессов и поддержанию их совместимости с различными версиями серверов и т.д.

[ОБНОВЛЕНО 23/03/2014, после получения поддержки - спасибо!]

Я пытался каким-то образом попытаться реализовать выше (я искал реализацию, нарисовал пробел, поэтому попытался написать свой собственный), и это было тяжело, как я думал! Я фактически отказался от него, поскольку нашел более простой способ добиться этого в другой архитектуре, но здесь класс, который я написал, пытался. Он по существу работает, но был хрупким для изменений окружающей среды, в которых я работал (т.е. Он не очень хорошо справляется с ошибками или проблемами).

Он использует:

  • herzult/PHP-SSH
  • файл конфигурации ssh - трюк, упрощающий настройку учетных данных для проверки подлинности в коде

(Примечание. Мне пришлось быстро разделить несколько деталей из кода, чтобы опубликовать его. Поэтому вам нужно немного поиграть, чтобы интегрировать его в ваше приложение/пространство имен и т.д.)

<?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 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;
    }

}

Ответ 3

Это выглядит многообещающим: http://gitphp.org

Я думаю, что это сделает для вас. Вот его описание:


GitPHP является веб-интерфейсом для репозиториев git. Он эмулирует внешний вид стандартного gitweb, но написан на PHP и использует шаблоны Smarty для настройки. Он имеет несколько дополнительных функций, включая подсветку синтаксиса через класс GeSHi PHP и поддержку категории проектов. Он работает со стандартным git, а также с msysgit в Windows.

Настройка должна быть довольно простой - просто извлеките tarball, где вы хотите его установить, скопируйте config/gitphp.conf.php.example в config/gitphp.conf.php и установите в корневой каталог, чтобы указать на ваш где находятся ваши голые репозитории git, и создайте каталог templates_c, который можно записать на веб-сервер, если его еще нет. Вы можете просмотреть все доступные параметры и значения по умолчанию в файле config/gitphp.conf.defaults.php и скопировать параметр в ваш файл конфигурации, если вы хотите переопределить значение по умолчанию. Вы также можете скопировать config/projects.conf.php.example в config/projects.conf.php и отредактировать его, если хотите более продвинутый контроль над вашими проектами, например, определение категорий проектов или загрузка проектов из текстового файла. Более подробные инструкции приведены в прилагаемом README.

Примечание. Если вы обновили существующий файл gitphp.conf.php, он не будет перезаписан, но я рекомендую проверить gitphp.conf.defaults.php для новых параметров конфигурации, которые могут быть добавлены.

Вы можете просмотреть текущую копию, выполняемую на этом сайте.