草庐IT

php - 通过 php 通过 http 执行 git 命令

coder 2024-04-08 原文

操作系统 - Ubuntu 14.04

我正在使用 GIT webhooks 进行部署。

我已将部署 key 添加到 git 存储库,现在我想在本地存储库发生推送时触发 git pull origin master 命令。

这是我通过浏览器调用的test.php文件:

<?php       
    //echo "THis is a test file on a test repo for testing the deploy functionality using github webhooks!!!!";
    echo exec('whoami');
    echo exec('sh -x /var/www/proj/test/git.sh');
?>

这是 git.sh shell 文件:

#!/bin/bash
cd /var/www/proj-dir/test
git pull origin master

当我在终端上使用 php test.php 运行它时,我得到了预期的正确结果:

 ubuntu From github.com:repo/test
 * branch            master     -> FETCH_HEAD
 Already up-to-date.

ubuntu for whoami 后跟 git pull 输出。

现在问题是当我通过浏览器调用相同的 http://example.com/test.php 它显示用户或 whoami 输出为 www-data,这是apache用户,但是我尝试更新php文件的权限来执行,并将用户更改为www-data但是没有用。
检查了 apache 日志,当我通过浏览器执行时出现权限错误

  Please make sure you have the correct access rights and the repository exists. + cd /var/www/proj/deploy-test + git pull origin master 

主机 key 验证失败。致命:无法从远程存储库读取。请确保您拥有正确的访问权限并且存储库存在。

我需要进行哪些更新才能使文件通过浏览器请求工作?

如果我需要更新 sudoers 文件,应该更新什么?

更新
我将 .ssh 键添加到 var/www/ 目录,因为这是 apache 用户的家。但我还是得到了

git pull origin master
error: cannot open .git/FETCH_HEAD: Permission denied

我还为 www-data 用户添加了一行,以便能够执行 sh 文件。

 www-data ALL=(anthony) NOPASSWD: /var/www/mysite/vendor/tmd/auto-git-pull/scripts/git-pull.sh

引用 here仍然没有运气
将 .git 文件夹的权限更新为 www-data 用户

sudo chown www-data:www-data/var/www/proj/test/.git

最佳答案

这似乎不是 PHP 问题,而是 git 配置问题。 Git 已针对用户 ubuntu 而非用户 www-data 正确配置。

您可以尝试让 PHP 像 ubuntu 一样运行,但这似乎不是最简单也不是正确的。我建议为 www-data 用户正确配置 git。

我怀疑您可以通过在终端上运行来重现该问题:

# become www-data user
sudo su www-data
# actions from your git.sh file
cd /var/www/proj-dir/test
git pull origin master

在验证你确实有一个复制场景后,你可以尝试为 www-data 用户解决这个问题。

当以任一用户身份运行时,git config --list 的输出可能会有所不同。有关该分数的更多帮助,请参阅 https://git-scm.com/book/en/Getting-Started-First-Time-Git-Setup

也可能是文件权限/所有权差异导致了问题。为了排除这种情况,我建议您使用 git clone ... 作为用户 www-data 在文件系统的其他路径中创建一个新的克隆和工作副本。然后再次查看 git pull 现在是否按预期工作。

无论如何,您都可以考虑为 www-data 提供自己的工作副本(无论权限问题如何)。这也将避免必须处理工作副本中可能导致 merge 问题的未提交更改。从 PHP/git.sh 自动/无人值守地处理这些可能很麻烦。

然后建议的工作流将是:在您当前的工作目录中开发为 ubuntuadd/commit/push您的更改。然后让 PHP 自己执行 pull(作为 www-data)。

关于php - 通过 php 通过 http 执行 git 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32116917/

有关php - 通过 php 通过 http 执行 git 命令的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  4. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  5. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  6. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  7. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  8. ruby - Chef 执行非顺序配方 - 2

    我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul

  9. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

    我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

  10. ruby - 为什么 Ruby 的 each 迭代器先执行? - 2

    我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试

随机推荐