適用場景:本地開發,進行代碼更改後希望服務端(遠端)代碼同步更改.
先了解一些概念:
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