目标效果:在本地改好代码,git push完成,服务端可以自动同步代码。
基本思路:在服务器搭建一个 git 仓库,利用 post-receive 钩子,实现自动更新代码。
操作步骤:
1,用 root 通过ssh登录远程服务器,然后添加 git 用户
ssh root@server_ip
# 输入密码
# ...
adduser gituser // 添加一个名为 gituser 的用户,目录为 /home/gituser
2,打开rsa认证
vim /etc/ssh/sshd_config
# 移动到滑动到末尾,命令 Shift+g
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
3,创建 gituser 的ssh
cd /home/gituser
mkdir .ssh
cd .ssh
vim authorized_keys
这时候远程处于编辑 authorized_keys
状态。
如果本地没有创建过ssh公钥,建议开启另一个本地的终端,创建本地的ssh
cd ~/.ssh
ssh-keygen -t rsa -C "your_email"
# 一路回车即可
然后将 id_rsa.pub
的内容拷贝到 authorized_keys
中。
4,设置 git 用户信息
git config --global user.email "your_email"
git config --global user.name "git_user_name"
本地也要设置,本地和远程可以不一致。
5,远程创建裸仓库
cd /home/gituser
mkdir git
cd git
mkdir webserver.git
git init --bare webserver.git
6,clone 一份到 www 目录
例如服务器设置的目录是 /home/gituser/www/webserver
cd /home/gituser/www
git clone /home/gituser/git/webserver.git webserver
7,配置 post-receive 钩子
cd /home/gituser/git/webserver.git/hooks
vim post-receive
# 文件内容
#!/bin/bash
cd /home/gituser/www/webserver
unset GIT_DIR // https://stackoverflow.com/questions/9905882/git-post-receive-not-working-correctly
git pull
8,修改权限和所有者
上面有些文件是在 root 下面创建的,所以要改回给 gituser
chown -R gituser:gituser /home/gituser
chmod -R 777 /home/gituser/git/webserver.git/hooks
9,本地拉代码回来,提交
git clone gituser@server_ip:/home/gituser/git/webserver.git webserver
# 随便写点什么
git commit -m "message"
git push
然后检查远程 /home/gituser/www/webserver
目录即可。
调试:
如果发现远程webserver文件没有更新,可以尝试在 post-receive 加命令,输出日志到 ~/log.txt
可以参考:
echo "beign" > /home/gituser/log.txt #判断钩子是否被触发,如果没有,检查权限和文件名
git fetch >> /home/gituser/log.txt
git pull &> /home/gituser/pull_log.txt # 查看pull错误