自己寫的網站,每次push程式碼後都要ssh進入伺服器手動同步程式碼,不喜歡這樣的重複勞動,索性使用git hooks來自動完成程式碼同步。每次在push了之後就會自動執行指令碼
1. 建立倉庫
在/home/yourname/repos/
目錄下,執行git init --bare test.git
,在伺服器端初始化一個遠端的Git裸倉庫。裸倉庫裡只有git索引,不包含工作目錄。
通常來說,在Linux裡Web專案是放在/var/www
目錄之下,我們在這目錄下clone上面建立的倉庫。
cd /var/www
git clone /home/yourname/repos/project.git
複製程式碼
2. 新增鉤子
在裸倉庫中Git鉤子存放於,hooks
目錄,如果是普通的git資料夾,則存放於.git/hooks
目錄內,每個Git倉庫都會這個資料夾,裡面放置一些例項指令碼,所有的例項指令碼都是shell指令碼,只要是正確命名的可執行指令碼都能使用,Ruby、Python或其他語言也是可行的。
hooks
目錄內預設包含如下檔案。去掉檔案後面的.example
即可使用,別忘了chmod +x
新增可執行許可權。
➜ hooks git:(master) ls
applypatch-msg.sample pre-commit.sample prepare-commit-msg.sample
commit-msg.sample pre-push.sample update.sample
post-update.sample pre-rebase.sample
pre-applypatch.sample pre-receive.sample
複製程式碼
檔名已經清楚地表述了每個鉤子的作用。我們想做的是倉庫被push後自動部署,所以要用到的是post-update
鉤子,修改的鉤子是在/home/yourname/repos/project.git
倉庫裡的鉤子,不要修改到/var/www/project
裡了
3. 修改鉤子
先用cp post-update.sample post-update
複製一個新檔案,再編輯此檔案。每一行命令都已新增註釋
# 進入專案目錄
cd /var/www/project
# 獲取倉庫裡的新提交
git fetch /home/yourname/repos/project.git
# 將程式碼與倉庫同步,拋棄當前所有修改
git clean -f
git reset --hard origin/master
## 以下指令適用於laravel專案,可根據專案自由修改
# 更新依賴包
composer install
npm install
php artisan migrate
# 前端專案按生產環境生成前端檔案
npm run production
複製程式碼
最後一行命令如果遇到許可權問題,則需要將使用者新增到www-data中。使用命令usermod -G www-data yourname
,並在最後一行新增chgrp www-data . -R