适用场景:本地开发,进行代码更改后希望服务端(远端)代码同步更改.
先了解一些概念:
Git目录 与 工作目录
Git目录
是为你的项目存储所有历史和元信息的目录 - 包括所有的对象(commits,trees,blobs,tags), 这些对象指向不同的分支.
每一个项目只能有一个Git目录
(这和SVN,CVS的每个子目录中都有此类目录相反), 这个叫.git
的目录在你项目的根目录下(这是默认设置,但并不是必须的). 如果你查看这个目录的内容, 你可以看所有的重要文件:
$>tree -L 1 . |-- HEAD # 这个git项目当前处在哪个分支里 |-- config # 项目的配置信息,git config命令会改动它 |-- description # 项目的描述信息 |-- hooks/ # 系统默认钩子脚本目录 |-- index # 索引文件 |-- logs/ # 各个refs的历史信息 |-- objects/ # Git本地仓库的所有对象 (commits, trees, blobs, tags) `-- refs/ # 标识你项目里的每个分支指向了哪个提交(commit)。
Git的 工作目录
存储着你现在(checkout)来用来编辑的文件. 当你在项目的不同分支间切换时, 工作目录里的文件经常会被替换和删除. 所有历史信息都保存在 Git目录
中 ; 工作目录只用来临时保存checkout 文件的地方, 你可以编辑工作目录的文件直到下次提交(commit)为止.
(也许现在还有其它 文件/目录 在 'Git目录' 里面, 但是现在它们并不重要)
Git 钩子
Git 钩子
(hooks)是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。通过钩子可以自定义 Git 内部的相关(如 git push)行为,在开发周期中的关键点触发自定义的行为。Git 含有两种类型的钩子:客户端的和服务器端的。客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。了解更改请参考https://aotu.io/notes/2017/04/10/githooks/index.html
裸Git库
使用以下命令创建的git仓库称为裸Git库。
git init xxx --bare
裸(bare)仓库里只存储历史和元信息(详细格式),不会维护工作目录。(言外之意是本地提交数据后裸Git库内的文件不会更新,都没有工作目录怎么更新。)
部署流程
原理图
步骤
服务端:
-
在指定目录(如/opt/test 测试环境是centOs )建立裸仓库负责监听用户的本地push事件
mkdir /opt/test cd /opt/test npm init barerepo --bare #这步很重要 建立裸仓库
-
我们创建好裸仓库后进入到
barerepo
目录的中,可以看到如文章开头的时候所列的Git目录内容一致 -
进入hooks目录,会发现Git提供的默认钩子如下,加上.sample相当于是注释, 去掉.sample后git才会真正的**这个钩子。
-
此时我们创建一个服务端自动同步数据的钩子
-
注意,我们刚刚在脚本中使用了/opt/realrepo那么该路径必须存在,所以记得创建该文件夹,此时opt目录下应为下图,至此服务端配置完毕。
-
在该钩子中进行编辑如下
-
mv post-update.sample post-update # 使得钩子生效 vim post-update chmod 777 post-update # 更改权限
#!/bin/sh unset GIT_DIR #一定要清除变量 不然会引起remote: fatal: Not a git repository: ‘.’错误。 DIR_ONE=/opt/realrepo #此目录为服务器页面展示目录 也就是实际你想同步文件到哪的库 cd $DIR_ONE git init git remote add origin /opt/test/barerepo git clean -df git pull origin master
本地端:
-
本地就比较容易了,首先先本地新建一个空库 然后配置一下远端库
git init git remote add origin [email protected]:/opt/test/barerepo
此时在本地做一些更改 touch hello git add . git commit -m "first commit" git push origin master
此时可以看到我们的post-update 钩子已经生效了
检查一下
最后在服务端的/opt/realrepo下查看一下
发现已经出现了我们提交的hello
文件 这个拉取过程是自动化完成的。
PS: 若有RSA 公私钥问题 请自行搜索解决。
参考链接:
https://segmentfault.com/a/1190000002528674
https://segmentfault.com/a/1190000000356485
https://segmentfault.com/a/1190000018625437
https://segmentfault.com/a/1190000000356487
https://segmentfault.com/q/1010000002549403/a-1020000002550996
https://aotu.io/notes/2017/04/10/githooks/index.html
http://gitbook.liuhui998.com/1_3.html
https://blog.csdn.net/Do_Only/article/details/90706461
https://blog.csdn.net/liuweixiao520/article/details/78971221 与GitHub结合使用
https://www.cnblogs.com/yimingwang/p/9160531.html