【问题标题】:Executing git commands via PHP通过 PHP 执行 git 命令
【发布时间】:2011-12-19 14:09:46
【问题描述】:

git add .git commit -m 之类的 git 命令如何使用 php 执行?

它适用于为维护学术项目创建集中存储库设施的项目。

exec() 似乎不起作用。

<?php
$path = "/var/www/repos/$_POST[project]"; 
$a='';
chdir($path);
exec("git add .");  
exec("git commit -m'message'");
echo "<h3 align = center> Succesfully commited all the files.</h3>";
?>

【问题讨论】:

  • 使用像php-git这样的库
  • exec 应该可以正常工作,只要 PHP 脚本有权更新您的存储库。尝试使用system(),看看返回值是什么。
  • 是否可以通过修改给出的代码来做到这一点?
  • 已解决...问题在于 .git 的所有权,而不是 www-data

标签: php git exec


【解决方案1】:

这绝对是可能的。我在我的一个项目中实现了它。 但是,您应该注意权限。

在 linux 上,exec 命令通常会使用www-data 用户执行。 所以你应该允许www-data在你的工作目录上读写。

一种快速而肮脏的方法是:chmod o+rw -R git_directory

【讨论】:

  • 简单地说,git init命令必须由用户“www-data”运行。这解决了我的问题,使用php脚本来完成
  • 我是 GIT 和 linux 的新手(我是 windows 用户)你能解释一下这对你有什么作用吗?你在哪里执行 chmod 命令(在 cmd 的 php 中?)& git_directory 是什么?是'.git'吗?
  • @asachanfbd, 1) chmod 应该使用 sudo 在命令行中执行, 2) git_directory 是 .git 的父目录
  • 在 Windows(xampp 服务器)中怎么样,它对我不起作用。运行 whoami 时,用户是 nt authority\system 。我怎样才能给那个用户授权?
【解决方案2】:

还有另一种解决方案,就是像这样简单地使用php反引号

$message = `git log -1 --pretty=%B`; // get commit message

$deploy_tag = `git describe --tags`; // get commit tags

$hash = `git log -1 --pretty=%h`; // get the hash

【讨论】:

    【解决方案3】:

    我在这里找到了 2 个问题的非常简单的解决方案

    1) Git 从安全的远程拉取而不使用密码

    • 创建一个 ssh 密钥对,使用ssh-keygen
    • 上传公钥到你的 git 远程主机
    • 配置 ~/.ssh/config 文件以添加指令以通过 git 使用此生成的私钥

      host gitlab.com
       HostName gitlab.com
       IdentityFile ~/.ssh/private_key
       User git
      

      现在所有的 git 命令都将使用这个 private_key 连接到远程

    2) 从 www-data 用户运行 git 命令

    • 更新 sudoers 文件以允许 www-data 用户运行 git 命令,编辑运行以下命令

      $ sudo visudo
      

      在用户偏好下添加以下行

      www-data    ALL=(raaghu) NOPASSWD: /usr/bin/git
      

      意思是来自ALL终端的www-data用户作为raaghu可以运行/usr/bin/gitNOPASSWD

      请注意:如果您不了解 sudoers 文件,请勿尝试此方法,否则可能会造成安全漏洞

    • 创建 git-pull.sh 文件以运行 git 命令

      cd /var/www/my-repo
      sudo -u raaghu git pull origin
      
    • 从 php 运行这个 git-pull.sh 文件

      exec("/bin/bash /var/www/git-pull.sh");
      

    【讨论】:

      【解决方案4】:

      我首先对我的 bitbucket 服务器实例运行测试以在屏幕上输出任何错误消息:

      echo shell_exec("cd /website/root/htdocs && git status 2>&1");
      

      这引发了一个错误,它找不到 git 命令,因此必须提供 git 二进制文件的完整路径:

      'which git'
      

      返回(进一步称为 YOU_FULL_GIT_BINARY_PATH_HERE):

      /usr/local/git/bin/git
      

      完整路径,例如'/usr/local/git/bin/git status' 现在可以很好地运行 git 命令了。

      这并不能克服在 .git/config git 用户中使用“git pull”命令所需的 git 密码。在 git repo 中运行以下命令:

      git config credential.helper store
      

      [command][1] 将提示输入密码并让您将其存储在本地未加密(仅受文件系统保护,例如在 /root/.git-credentials 中)。这将允许在不提示输入密码的情况下运行“git pull”。或者(可能更好)是为您的 Web 服务器(例如 apached)生成 ssh 密钥,然后将它们添加到您的 bitbucket 用户专用帐户或 repo 密钥。

      我所有的文件夹都设置为 apache 用户所有(Centos 6.8 其他版本可能是 www-data:www-data 等):

      chown -R apache:apache YOUR_WEB_FODLER
      

      我不必使用肮脏的把戏 'chmod o+rw -R' 来让所有工作正常。

      【讨论】:

        猜你喜欢
        • 2015-11-14
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 2018-11-21
        • 2015-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多