Maison php教程 php手册 PHP的Git类

PHP的Git类

Jun 06, 2016 pm 07:39 PM
git php personnel principal 命令 执行 编写

个人编写,用PHP执行GIT命令 主要编写目地是利用git的push钩子访问该PHP能实现push触发自动部署 只实现了pull方法,其余方法可以以类似方法实现 ?php/** * Class Git * @author Jacky.Zhuo * @time 2015-11-01 *///Git操作类class Git { private $_path; priva

个人编写, 用PHP执行GIT命令
主要编写目地是利用git的push钩子访问该PHP能实现push触发自动部署

只实现了pull方法, 其余方法可以以类似方法实现

<?php
/**
 * Class Git
 * @author Jacky.Zhuo
 * @time 2015-11-01
 */

//Git操作类
class Git {
    private $_path;
    private $_projectName;
    private $_owner;
    private $_username;
    private $_password;
    private $_host;
    private $_suffix = 'git';
    private $_isHttps = false;
    
    private $_url = '';
    
    private $_log;
    private $_output;
    
    private $_descriptorspec;
    
    /**
     * 构造函数
     *
     * 设置git参数
     *
     * @param string $path 项目本地路径
     * @param string $projectName 项目名
     * @param string $owner 拥有者
     * @param string $username 帐号用户名
     * @param string $password 帐号密码
     * @param string $host 项目所在地址
     * @param string $suffix 项目后缀
     * @param boolen $isHttps 项目协议是否为https
     * @param string $log 访问日志文件路径
     * @param string $output 命令日志文件路径
     * @return void
     */
    public function __construct($path = __DIR__, $projectName, $owner, $username, $password, $host, $suffix = false, $isHttps = false, $log = false, $output = false) {
        $configFields = array('path', 'projectName', 'owner', 'username', 'password', 'host');

        //设置项目信息
        foreach($configFields as $field) {
            if(empty($$field)) {
                throw new Exception("{$field} is empty!");
                return false;
            }
            
            $this->{'_' . $field} = $$field;
        }
        
        //设置路径协议
        if($isHttps) {
            $this->_isHttps = true;
        }
        
        //设置项目后缀
        if($suffix) {
            $this->_suffix = $suffix;
        }
        
        //设置log地址
        if($log) {
            $this->_log = $log;
        } else {
            $this->_log = __DIR__ . '/git_log.txt';
        }
        
        //设置git命令返回记录文件地址
        if($output) {
            $this->_output = $output;
        } else {
            $this->_output = __DIR__ . '/git_output.txt';
        }
        
        //设置git命令参数
        $this->_descriptorspec = array(
            0 => array('pipe', 'r'),
            1 => array('pipe', 'w'),
            2 => array('file', $this->_output, 'a')
        );
        
        //生成远程url
        $this->_createUrl();
    }
    
    /**
     * pull方法
     *
     * 从服务器中pull到本地
     * 
     * @param string $branch 默认为 origin master
     * @return boolen
     */
    public function pull($branch = 'origin master') {
        $cmd = 'git pull ' . $this->_url . ' ' . $branch;
        return $this->_runCmd($cmd);
    }
    
    public function fetch() {
        
    }
    
    public function push() {
        
    }
    
    public function gclone() {
        
    }
    
    /*
     * 生成git地址url
     *
     * git地址格式 [https://][username]:[password]@[host]/[owner]/[projectName].[suffix]
     *
     * @reutrn void
     */
    private function _createUrl() {
        $url = '';
        
        //添加协议
        if($this->_isHttps) {
            $url .= 'https://';
        } else {
            $url .= 'http://';
        }
        
        //添加用户名密码
        $url .= urlencode($this->_username) . ':' . urlencode($this->_password);

        //添加地址
        $url .= '@' . $this->_host . '/';

        //添加项目地址
        $url .= $this->_owner . '/' . $this->_projectName;

        //添加项目后缀
        $url .= '.' . $this->_suffix;

        $this->_url = $url;
    }
    
    /*
     * log方法
     *
     * 记录访问日志
     *
     * @param string $msg 日志
     * @return void
     */
    private function _writeLog($msg) {
        $log = date('Y-m-d H:i:s') . ":\n";
        $log .= $msg;
        $log .= "-------------------------------------\n";
        
        file_put_contents($this->_log, $log, FILE_APPEND | LOCK_EX);
    }
    
    /*
     * 运行命令行
     *
     * 该方法可以运行命令行, 并会自动记录命令行日志
     *
     * @param string $cmd 要运行的命令行
     * @return boolen
     */
    private function _runCmd($cmd) {
        file_put_contents($this->_output, date('Y-m-d H:i:s') . ":\n", FILE_APPEND);
        
        $process = proc_open($cmd, $this->_descriptorspec, $pipes, $this->_path);
        if(is_resource($process)) {
            $output = stream_get_contents($pipes[1]);
            fclose($pipes[1]);
        } else {
            $output = 'no command';
        }
        
        $returnValue = proc_close($process);
        
        file_put_contents($this->_output, "---------------------------------\n", FILE_APPEND);
        
        if($returnValue) {
            $this->_writeLog('Command faild.' . "\n");
            return false;
        } else {
            $this->_writeLog('Command success: ' . $output);
            return true;
        }
    }
}

try {
    $git = new Git(__DIR__, 'project', 'owner', 'username', 'password', 'host', 'suffix', true);
} catch(Exception $e) {
    echo $e->getMessage();
    die;
}

$git->pull('test');
Copier après la connexion

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Choisir entre PHP et Python: un guide Choisir entre PHP et Python: un guide Apr 18, 2025 am 12:24 AM

PHP convient au développement Web et au prototypage rapide, et Python convient à la science des données et à l'apprentissage automatique. 1.Php est utilisé pour le développement Web dynamique, avec une syntaxe simple et adapté pour un développement rapide. 2. Python a une syntaxe concise, convient à plusieurs champs et a un écosystème de bibliothèque solide.

PHP et Python: différents paradigmes expliqués PHP et Python: différents paradigmes expliqués Apr 18, 2025 am 12:26 AM

PHP est principalement la programmation procédurale, mais prend également en charge la programmation orientée objet (POO); Python prend en charge une variété de paradigmes, y compris la POO, la programmation fonctionnelle et procédurale. PHP convient au développement Web, et Python convient à une variété d'applications telles que l'analyse des données et l'apprentissage automatique.

Impact de PHP: développement Web et au-delà Impact de PHP: développement Web et au-delà Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP et Python: une plongée profonde dans leur histoire PHP et Python: une plongée profonde dans leur histoire Apr 18, 2025 am 12:25 AM

PHP est originaire en 1994 et a été développé par Rasmuslerdorf. Il a été utilisé à l'origine pour suivre les visiteurs du site Web et a progressivement évolué en un langage de script côté serveur et a été largement utilisé dans le développement Web. Python a été développé par Guidovan Rossum à la fin des années 1980 et a été publié pour la première fois en 1991. Il met l'accent sur la lisibilité et la simplicité du code, et convient à l'informatique scientifique, à l'analyse des données et à d'autres domaines.

Que faire si le téléchargement git n'est pas actif Que faire si le téléchargement git n'est pas actif Apr 17, 2025 pm 04:54 PM

Résolve: lorsque la vitesse de téléchargement GIT est lente, vous pouvez prendre les étapes suivantes: Vérifiez la connexion réseau et essayez de changer la méthode de connexion. Optimiser la configuration GIT: augmenter la taille du tampon post (Git Config - Global Http.PostBuffer 524288000) et réduire la limite à basse vitesse (Git Config - Global Http.LowspeedLimit 1000). Utilisez un proxy GIT (comme Git-Proxy ou Git-LFS-Proxy). Essayez d'utiliser un client GIT différent (comme SourceTree ou GitHub Desktop). Vérifiez la protection contre les incendies

Comment télécharger des projets GIT vers local Comment télécharger des projets GIT vers local Apr 17, 2025 pm 04:36 PM

Pour télécharger des projets localement via GIT, suivez ces étapes: installer Git. Accédez au répertoire du projet. Clonage du référentiel distant à l'aide de la commande suivante: Git Clone https://github.com/username/repository-name.git

Comment mettre à jour le code dans GIT Comment mettre à jour le code dans GIT Apr 17, 2025 pm 04:45 PM

Étapes pour mettre à jour le code GIT: Consultez le code: Git Clone https://github.com/username/repo.git Obtenez les derniers modifications: Git Fetch Merge Modifications: Git Merge Origin / Master Push Changes (Facultatif): Git Push Origin Master

Comment supprimer un référentiel par git Comment supprimer un référentiel par git Apr 17, 2025 pm 04:03 PM

Pour supprimer un référentiel GIT, suivez ces étapes: Confirmez le référentiel que vous souhaitez supprimer. Suppression locale du référentiel: utilisez la commande RM -RF pour supprimer son dossier. Supprimer à distance un entrepôt: accédez à l'entrepôt, trouvez l'option "Supprimer l'entrepôt" et confirmez l'opération.

See all articles