Git hook與網(wǎng)站自動(dòng)部署

git hook

一般來說,在服務(wù)器部署的時(shí)候不建議在網(wǎng)站的根目錄建立遠(yuǎn)程倉庫,一是處于安全考慮,二是以下情形:因?yàn)楫?dāng)用戶A正在服務(wù)端master1分支上操作,此時(shí)用戶2從本地push到master1分支會(huì)產(chǎn)生矛盾。解決辦法就是使用git init –-bare方法創(chuàng)建一個(gè)裸倉庫,然后再使用git hook工作目錄(working tree)設(shè)置為網(wǎng)站根目錄。

git init 和 git init –-bare 的區(qū)別

之所以叫裸倉庫是因?yàn)檫@個(gè)倉庫只保存git歷史提交的版本信息,而不允許用戶在上面進(jìn)行各種git操作,如果你硬要操作的話,只會(huì)得到下面的錯(cuò)誤(”This operation must be run in a work tree”);所以該版本庫不能稱為工作目錄(working tree);

首先,我們要通過 git init --bare 初始化一個(gè)遠(yuǎn)程倉庫

 cd ~
$ mkdir npubbs
$ cd npubbs
$ git init --bare 

建立本地倉庫
這個(gè)倉庫就是通過 git init 初始化出來最常見的本地倉庫,它的作用是拉去遠(yuǎn)程倉庫(tong一目錄)最同新的源碼,然后在本地倉庫里進(jìn)行操作,把代碼鉤到網(wǎng)站根目錄)。

$ cd ~
$ mkdir npubbs-local
$ cd npubbs-local
$ git clone ~/npubbs  #從遠(yuǎn)程倉庫 clone 出源碼

為遠(yuǎn)程倉庫設(shè)置 Hook

$ cd ~/npubbs/hooks
$ vim post-receive

修改在 post-receive里面的執(zhí)行腳本,設(shè)置工作目錄(working tree)為網(wǎng)站根目錄

git --work-tree=/var/www/npubbs --git-dir=/home/bbsdev/npubbs checkout -f
#/var/www/npubbs為網(wǎng)站根目錄
echo "-*- git checkout to /var/www/npubbs -*-"                                              

最后,為post-receive添加可執(zhí)行權(quán)限

chmod +x post-receive

添加 remote 源
在開發(fā)端,為原有 Git 項(xiàng)目里面添加一條新的 remote 源,往這個(gè) remote 源里面 push 代碼,就會(huì)自動(dòng)觸發(fā)git hook的腳本。

$ git remote add deploy user@server.ip:/home/bbsdev/npubbs
$ git push deploy master

對了,記得初學(xué)的時(shí)候手殘?jiān)诟夸浗吮镜貍}庫,這種情況直接在該目錄rm -rf .git即可。

學(xué)習(xí)心得

版本控制我在學(xué)校管理BBS的時(shí)候就已經(jīng)很熟悉,但是上次思沃大講堂發(fā)現(xiàn)同事們有很多比我更深入的理解,所以分享一下我新學(xué)到的東西;

Git 的三種狀態(tài)

Git 系統(tǒng)上的文件有三種狀態(tài)已修改(modified)和已暫存(staged)、已提交(committed)。

已修改表示修改了文件,但還沒保存到數(shù)據(jù)庫中。
已暫存表示對一個(gè)已修改文件的當(dāng)前版本做了標(biāo)記,使之包含在下次提交的快照中。
已提交表示數(shù)據(jù)已經(jīng)安全的保存在本地?cái)?shù)據(jù)庫中。

merge和rebase的區(qū)別

git merge 會(huì)生成一個(gè)新得合并節(jié)點(diǎn),保留原始分支情況,而rebase不會(huì)
比如:

      D---E test
     /
A---B---C---F master

使用merge合并, 為分支合并自動(dòng)識別出最佳的同源合并點(diǎn):

      D--------E
     /          \
A---B---C---F----G   test, master

而使用rebase則不會(huì)保留原始的分支情況,直接線性合并:

A---B---D---E---C'---F'   test, master 

使用git pull時(shí)默認(rèn)是merge, 加 --rebase參數(shù)使其使用rebase方式

git pull --rebase 

大家都推薦rebase,因?yàn)榫€性更直觀

新學(xué)的指令

git diff # 顯示所有未添加至index的變更
git diff --cached # 顯示所有已添加index但還未commit的變更
git whatchanged # 顯示提交歷史對應(yīng)的文件修改
git show-branch # 圖示當(dāng)前分支歷史
git show-branch --all # 圖示所有分支歷史
git stash list # 查看所有暫存
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容