Qingquan-Li / blog

My Blog
https://Qingquan-Li.github.io/blog/
132 stars 16 forks source link

git部署项目代码至服务器 #113

Open Qingquan-Li opened 5 years ago

Qingquan-Li commented 5 years ago

方法一:直接推送部署git push to deploy

参考:

部署基于 Git 的 Web 项目的一种方法是在服务器上保留一份 checked-out 的工作目录副本。准备好项目新版本后,你将登录服务器并运行 git pull 以获取(或使用钩子 hooks 自动 pull )并部署新更改。虽然这种技术有一些缺点,但它很容易设置和使用,特别是如果你的项目主要由静态内容组成。

使用 Git 2.3 或更新版本后,这种技术变得更加方便。现在,你可以将更改直接 push 到服务器上的仓库。如果未对服务器进行本地修改(保留一个干净的工作目录以避免合并冲突),则将自动检出对服务器当前分支的变化,并即时部署:

$ git init xxx.git
$ cd xxx.git && git config receive.denyCurrentBranch updateInstead

注:在服务器上,若不使用 $ git init --bare xxx.git 创建一个裸仓库,而是使用 $ git init xxx.git 创建一个普通仓库,这时,在本地执行 $ git push 推送项目到服务器将失败,除非在 $ git init xxx.git 创建仓库后执行上述命令。

实例:

$ git init server
$ cd server
$ touch a
$ git add .
$ git commit -m 0
$ git config --local receive.denyCurrentBranch updateInstead

$ cd ..
$ git clone server local
$ cd local
$ touch b
$ git add .
$ git commit -m 1
$ git push origin master:master

$ cd ../server
$ ls  # output:a b

附:第二次 push 推送报错:

 ! [remote rejected] master -> master (Working directory has unstaged changes)
error: failed to push some refs to 'git-name@ip:directory/xxx.git'

解决方法:.git/hooks 目录下添加 push-to-checkout 脚本:

git/hooks $ touch push-to-checkout
git/hooks $ sudo vim push-to-checkout # 添加脚本
git/hooks $ chmod 775 push-to-checkout # 添加权限

脚本内容:

#!/bin/sh
set -ex
git read-tree --reset -u HEAD "$1"

然后在本地开发环境中 $ git pull 后再提交。


什么时候不应该使用推送部署push to deploy

通过推送到 Git 仓库进行部署既快捷又方便,但并不适合所有人。例如:



方法二:使用git钩子部署deploy by hooks

参考:

使用 Git 钩子进行博客自动部署 实例:

配置 Git Hook :将目录切换至 /repos/xxx-bare.git/hooks ,用 $ cp post-update.sample post-update 命令复制并重命名文件后 $ sudo vim post-update 修改,增加执行脚本:

#!/bin/sh

unset GIT_DIR 
DIR_ONE=/home/user/www/blog/  # 此目录为服务器页面展示目录 
cd $DIR_ONE

git init
git remote add origin ~/repos/xxx-bare.git
git clean -df
git pull origin master

pm2 restart xxx  # pm2重启项目即可

注意: 一定要 unset GIT_DIR 清除变量, 不然会引起 remote: fatal: Not a git repository: ‘.’ 错误。



方法三:使用GitHub进行代码传输

使用「本地开发主机 => 提交代码到GitHub => 服务器Git拉取代码」的形式进行代码传输。

本地开发主机提交代码到 GitHub 后,服务器 $ git clone 克隆代码仓库,或 $ git pull (等价于 $ git fetch + $ git merge )拉取并合并代码。

拉取并合并本地代码实例:

# 查看远程仓库
(py37_dj_env) fatli@fatli-vm-ubuntu:~/github/polls$ git remote -v
origin  git@github.com:FatliTalk/polls.git (fetch)
origin  git@github.com:FatliTalk/polls.git (push)
# 拉取远程仓库
(py37_dj_env) fatli@fatli-vm-ubuntu:~/github/polls$ git fetch
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (1/1), done.
remote: Total 3 (delta 2), reused 3 (delta 2), pack-reused 0
Unpacking objects: 100% (3/3), done.
From github.com:FatliTalk/polls
   c756d23..5a5494e  master     -> origin/master
# 对比本地分支和远程分支(这也是使用GitHub管理代码的好处,可以对比修改内容)
(py37_dj_env) fatli@fatli-vm-ubuntu:~/github/polls$ git diff master origin/master
# 合并分支
(py37_dj_env) fatli@fatli-vm-ubuntu:~/github/polls$ git merge

注意:

不要在服务器上直接修改代码,不然 $ git pull 会失败。假如真的修改过(例如有一些文件是自动生成的),下次更新代码时,可以删除服务器仓库的代码,重新 $ git clone GitHub 上的代码。