如何使用PHP显示远程git日志

时间:2015-01-05 13:21:12

标签: php html git

我创建了一个由one.com托管的网站,用于学校项目。我想向访问者显示某些信息(通过git log命令检索)。为此,我尝试使用PHP和以下脚本(也找到了here):

<?php
// Author: Ngo Minh Nam
$dir = "azureuser@drone7.cloudapp.net:/home/azureuser/git/drones/";
$output = array();
chdir($dir);
exec("git log",$output);
$history = array();
foreach($output as $line){
    if(strpos($line, 'commit')===0){
        if(!empty($commit)){
            array_push($history, $commit);  
            unset($commit);
        }
        $commit['hash']   = substr($line, strlen('commit'));
    }
    else if(strpos($line, 'Author')===0){
    $commit['author'] = substr($line, strlen('Author:'));
    }
    else if(strpos($line, 'Date')===0){
    $commit['date']   = substr($line, strlen('Date:'));
    }
    else{       
    $commit['message']  .= $line;
    }
}

print_r($history);

?>

根据使用该脚本的用户,它应该工作。我个人认为,在我们的案例中,问题在于one.com托管我们的网站,而Git托管在我们项目团队中其他人创建的远程服务器上,应该可以通过以下方式访问:azureuser @ drone7.cloudapp.net:/家庭/ azureuser / GIT中/寄生虫/

这导致chdir只能找到位于我们网站层次结构中的文件夹。

有谁知道我们如何解决这个问题,并且能够在我们的网站上显示来自git日志(来自远程服务器)的信息?

1 个答案:

答案 0 :(得分:1)

如果您ssh访问远程git服务器,则可以通过ssh连接呼叫git log -10。要自动调用此命令,您应该使用公钥认证。

ssh azureuser@drone7.cloudapp.net "cd /home/azureuser/git/drones/; git log -10;"

纯PHP

在PHP中,这将是这样的:

$output = [];
exec(
    'ssh azureuser@drone7.cloudapp.net "cd /home/azureuser/git/drones/; git log -10;"',
    $output
);

注意:执行此PHP脚本的用户需要在远程服务器上进行公钥认证。

ssh2扩展

正如piotrekkr所提到的,如果服务器安装了PHP ssh2扩展,您可以使用它来远程调用命令

$connection = ssh2_connect('drone7.cloudapp.net', 22);

// Authentication. Use the return value of the function to determine if the login
// was successful.
// 
// Use either password ...
ssh2_auth_password($connection, 'azureuser', 'password');

// ... or public key authentication
ssh2_auth_pubkey_file(
    $connection,
    'azureuser',
    '/home/azureuser/.ssh/id_rsa.pub',
    '/home/azureuser/.ssh/id_rsa'
);

// Call git log command on the remote server
$stream = ssh2_exec($connection, 'cd /home/azureuser/git/drones/; git log -10;');

// Make stream blocking
stream_set_blocking($stream, true);
$lines = []

// We do not use `stream_get_contents` because of the possibly large output
while ($line = fgets($stream));
    $lines[] = $line;
} 

为了更方便地访问git存储库,您可以使用像gitlib这样的PHP git库。认为这是思考的食物。