如何利用git hooks进行远程服务器代码同步

适用场景:本地开发,进行代码更改后希望服务端(远端)代码同步更改.

先了解一些概念:

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库内的文件不会更新,都没有工作目录怎么更新。)

 

部署流程

原理图

 

步骤

服务端:

  1. 在指定目录(如/opt/test 测试环境是centOs )建立裸仓库负责监听用户的本地push事件

    mkdir /opt/test
    cd /opt/test
    npm init barerepo --bare #这步很重要 建立裸仓库
  2. 我们创建好裸仓库后进入到barerepo目录的中,可以看到如文章开头的时候所列的Git目录内容一致

  3. 进入hooks目录,会发现Git提供的默认钩子如下,加上.sample相当于是注释, 去掉.sample后git才会真正的激活这个钩子。

  4. 此时我们创建一个服务端自动同步数据的钩子

  5. 注意,我们刚刚在脚本中使用了/opt/realrepo那么该路径必须存在,所以记得创建该文件夹,此时opt目录下应为下图,至此服务端配置完毕。

  6. 在该钩子中进行编辑如下

  7. 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

 

 

本地端:

  1. 本地就比较容易了,首先先本地新建一个空库 然后配置一下远端库

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章