PHP自动部署关联git仓库下的代码

教程开始

# 进入根目录并执行下面命令生成公钥
ssh-keygen -t rsa -C "admin@xx.com"

# 查看公钥并部署到git服务器上
cat ~/.ssh/id_rsa.pub

# 创建git目录并设置用户, 例子为ghost, 完整目录为 /home/wwwroot/ghost
chown -R www:www /home/wwwroot/ghost

# 配置用户信息
sudo -Hu www git config --global credential.helper store # 永久保存  
sudo -Hu www git config --global user.name "xxxx"  
sudo -Hu www git config --global user.email "admin@xx.com" # 邮箱请与git服务上一致

# 拉代码,这个时候应该会要求你输入一次帐号密码
sudo -Hu www git clone https://xxxgit.com/xxx/ghost.git /home/wwwroot/ghost/  --depth=1

# 确保git目录有写的权限
chmod -R a+w *

# 如果.git不是www用户组就修改下
chown -R www:www .git

# hook.php
$target = '/home/wwwroot/ghost';
shell_exec("chown -R www:www .git 2>&1");  
shell_exec("git reset --hard HEAD 2>&1");  
shell_exec("git clean -df 2>&1");  
shell_exec("chmod -R a+w $target/ 2>&1");  
echo shell_exec("git pull 2>&1");  
shell_exec("chown -R www:www $target/");  

遇到的错误

PHP执行shell_exec一直返回NULL

查看php.inidisable_functions是否包含shell_exec, 包含的话去掉重启PHP就好了

shell_exec不返回错误信息

# 添加  2>&1
git pull  2>&1  

error: cannot open .git/FETCH_HEAD: Permission denied

# 给git下文件添加用户组
chown -R www:www ./.git/FETCH_HEAD  

www is not in the sudoers file. This incident will be reported

chmod u+w /etc/sudoers  
vi /etc/sudoers  
找到这行 root ALL=(ALL) ALL,在他下面添加xxx ALL=(ALL) ALL (这里的xxx是你的用户名)
chmod u-w /etc/sudoers  

fatal: could not read Username for 'https://gitee.com': No such device or address

error: insufficient permission for adding an object to repository database ./objects

sudo chmod 777 -R .git/objects  

参考文档