如何使用命令行在本地自动部署到远程服务器?这里我们使用git的post-receive
来简单实现.
本文实现的前提是:web端代码与git远程服务器不在同一台机器(如web代码放在腾讯云,git服务使用的github)
1.git服务端有一个远程仓库
2.开发者电脑上有一个clone下来的本地仓库,用于开发代码
3.web服务器也有一个clone下来的本地仓库,网站展示的内容就在此目录
自动部署的过程就是:从开发者电脑的本地仓库提交到远程仓库
的时候,web服务器端的本地仓库
自动更新远程仓库的代码。
git post-receive
机制:这个hook是git服务器在受到push
请求时,并且接受完代码提交时触发
在开发者本机打开git bash
// 开发者电脑上的本地版本
cd /d/project/
git clone git@github.com:username/imqianduan.git imqianduan
登录web服务器,安装 git
,假设web目录在/data
下
// WEB服务器端的本地版本
cd /data
git clone git@github.com:username/imqianduan.git imqianduan
在/data
目录下创建imqianduan-bare.git
cd /data
// imqianduan-bare.git是一个目录,习惯带`.git`后缀这样命名而已
git init --bare imqianduan-bare.git
// 注意:bare仓库不能复制已经有的,新的项目都需要新建(init)
上一步我们创建了imqianduan-bare.git
目录,进入此目录的hooks
目录
hooks目录下会有很多.sample
文件,这些是一些示例文件(不起作用的,起作用的不带.sample
后缀)
-rwxr-xr-x 1 root root 452 Jun 5 15:35 applypatch-msg.sample
-rwxr-xr-x 1 root root 896 Jun 5 15:35 commit-msg.sample
-rwxr-xr-x 1 root root 189 Jun 5 15:35 post-update.sample
-rwxr-xr-x 1 root root 398 Jun 5 15:35 pre-applypatch.sample
-rwxr-xr-x 1 root root 1704 Jun 5 15:35 pre-commit.sample
-rwxr-xr-x 1 root root 1239 Jun 5 15:35 prepare-commit-msg.sample
-rw-r--r-- 1 root root 1348 Jun 5 15:35 pre-push.sample
-rwxr-xr-x 1 root root 4951 Jun 5 15:35 pre-rebase.sample
-rwxr-xr-x 1 root root 3611 Jun 5 15:35 update.sample
发现没有post-receive.sample
示例文件,我们需要创建一个post-receive
cd imqianduan-bare.git/hooks/
// post-receive文件是没有任何文件名后缀的
// 创建
touch post-receive
// 编辑
vim post-receiv
post-receive
粘贴下面的代码,echo
输出的内容最终会在开发者电脑端打印出来
#!/bin/sh
#判断是不是远端仓库
IS_BARE=$(git rev-parse --is-bare-repository)
if [ -z "$IS_BARE" ]; then
echo >&2 "fatal: post-receive: IS_NOT_BARE"
exit 1
fi
echo "deploy start================================================"
unset GIT_DIR
# 填写第一步,web服务器上的本地仓库目录
DeployPath="/data/imqianduan"
cd $DeployPath
echo "deploying web: www.imqianduan.com"
git fetch --all
git reset --hard origin/master
echo "deploy end ================================================"
post-receive
必须有可执行权限
cd imqianduan-bare.git
chmod +x hooks/post-receive
查看一下远程源地址
$ git remote
origin
origin已经存在,就不能再添加origin,我们改名为deploy
// root:web服务器用户名
// x.x.x.x: web服务器的IP
git remote add deploy ssh://root@x.x.x.x/data/imqianduan-bare.git
再次使用git remote
查看,会发现多了一个deploy
$ git remote
deploy
origin
按顺序,我们必须先git push
到远程git服务器后,执行git push deploy
才可以拿到本地提交的最新代码。所以我们也可以多次git push
到远程git服务器后,再统一git push deploy
下载到web服务器端部署
注意:
root@x.x.x.x's password:
是要求输入web服务器
的root
用户名的密码
$ git push && git push deploy
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 253 bytes | 253.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1)
remote: Processing changes: done
remote: Updating references: 100% (1/1)
To git@github.com:username/imqianduan.git
e091df4..b9b0084 master -> master
root@x.x.x.x's password:
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 253 bytes | 253.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: deploy start================================================
remote: deploying web: www.imqianduan.com
remote: Fetching origin
remote: From git@github.com:username/imqianduan.git
remote: e091df4..b9b0084 master -> origin/master
remote: HEAD is now at b9b0084 test5
remote: deploy end ================================================
To ssh://x.x.x.x/data/imqianduan-bare.git
e091df4..b9b0084 master -> master
git remote add deply 远程地址
的远程地址是否正确
fatal: '/data/imqianduan-bare.git' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
检查权限问题
检测post-receive是否有语法错误
如复制的时候,linux下很容易漏了第一个字母,导致变量报错
Unable to negotiate with 106.52.160.162 port 22: no matching host key type found. Their offer: ssh-rsa fatal: Could not read from remote repository.
使用git hooks(post-receive)实现简单的远程自动部署
linux下,设置git免密码操作
**git cherry-pick**可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0中的功能到v2.0中,这里就可以使用cherry-pick了,其实也就是对已经存在的commit 进行再次提交.
在使用Git的过程中,有时候会因为一些误操作,比如reset、rebase、merge等。特别是在Commit之后又执行了`git reset --hard HEAD`强制回滚本地记录以及文件到服务器版本,导致本地做的修改全部恢复到Git当前分支的服务器版本,同时自己的Commmit记录也消失了。碰到这种情况,不要慌,我们在Git上做的任何操作都只是在原来之前的操作上做修改,并且会被记录下来保存,也就是说无论你做了什么,对于Git来说都可以进行回滚操作。
它的原理很简单,就是将代码提交的历史,按照两分法不断缩小定位。所谓"两分法",就是将代码历史一分为二,确定问题出在前半部分,还是后半部分,不断执行这个过程,直到范围缩小到某一次代码提交。
当在git操作log,如`git log`后,然后非正常退出,即使用`CTRL+C`退出,这个时候git输入命令就不会显示了,只有光标,这时怎么办?
.gitignore文件配置不生效
git修改当前项目用户
Git修改最近一次已经提交了的commit及push
git常用命令,git查看某个文件的修改记录,分支备注
通过设置git-diff driver,结合.gitattributes文件,使git diff命令忽略某些目录。例如我们只希望看到比较src目录,不希望看到比较dist目录
学习这本书的目的是让你了解版本控制,并且尽可能快速简单的掌握 Git。但是和另外一些关于介绍版本控制的图书不一样,阅读这本书并不需要你有很专业的 IT 或者电脑背景知识,它也面向那些编程的初学者,软件构架师,或者是项目经理。在技术方面你也不需要有很多专业知识,我们会以循序渐进的方式帮助你来理解版本控制和掌握 Git。
git如何打包增量文件?
github push时免密码