所以我已经在服务器上设置了一个checkout后钩子,它将运行Composer
#!/bin/sh
# Composer Git Checkout Hook
PROJECT_NAME=example.com
cd /home/www/$PROJECT_NAME/htdocs
unset GIT_DIR
# Process composer.json if one exists.
if [ -f composer.json ]
then
echo "Processing Composer"
# Run the composer install
composer.phar install
fi
在部署时,它可以工作。但是,由于这是一个新服务器,而且我忘记启用cURL模块,因此安装失败,但接受推送。
$ git push deploy master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 348 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Processing Composer
remote: Loading composer repositories with package information
remote: Installing dependencies from lock file
remote: Your requirements could not be resolved to an installable set of packages.
remote:
remote: Problem 1
remote: - Installation request for facebook/php-sdk dev-master -> satisfiable by facebook/php-sdk dev-master.
remote: - facebook/php-sdk dev-master requires ext-curl * -> the requested PHP extension curl is missing from your system.
remote:
To ssh://adam@my-server.net/home/www/example.com/git
0fa8a61..afa63ae master -> master
如何获取Composer的安装和退出状态,以便远程存储库拒绝推送?
首先,您的设置有一个问题。如果deploy
是一个非裸回购,并且主分支被签出(我假设是这样),则不能将其推送到该回购。
如果你想拒绝推送,你需要在pre-receive
或update
钩子中这样做。您可以使用这些来检查Composer配置文件是否已经更改(在这种情况下,它将在提交中),如本问题所述。运行Composer本身需要签出,或者至少需要配置文件。运行Composer会减慢提交过程,因为git必须等到Composer完成后才能向客户端报告。注意,post-receive钩子也是如此,即使它们不能拒绝推送。
你可以做的是使用update
钩子,检查它是否包含一个更新的composer.json
在主分支中使用类似的东西,如果它这样做,然后运行Composer与更新的文件,以找出它是否包含错误。您可以为此专门创建一个文件夹。我现在手头没有Composer。但是进程的返回值通常是0
,表示成功,非零表示失败。