如何利用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

 

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