自己寫(xiě)的網(wǎng)站,每次push代碼后都要ssh進(jìn)入服務(wù)器手動(dòng)同步代碼,不喜歡這樣的重復(fù)勞動(dòng),索性使用git hooks來(lái)自動(dòng)完成代碼同步。
1. 創(chuàng)建倉(cāng)庫(kù)
在/home/yourname/repos/目錄下,運(yùn)行git init --bare test.git,在服務(wù)器端初始化一個(gè)遠(yuǎn)程的Git裸倉(cāng)庫(kù)。裸倉(cāng)庫(kù)里只有g(shù)it索引,不包含工作目錄。
通常來(lái)說(shuō),在Linux里Web項(xiàng)目是放在/var/www目錄之下,我們?cè)谶@目錄下clone上面建立的倉(cāng)庫(kù)。
cd /var/www
git clone /home/yourname/repos/project.git
2. 添加鉤子
在裸倉(cāng)庫(kù)中Git鉤子存放于,hooks目錄,如果是普通的git文件夾,則存放于.git/hooks目錄內(nèi),每個(gè)Git倉(cāng)庫(kù)都會(huì)這個(gè)文件夾,里面放置一些實(shí)例腳本,所有的實(shí)例腳本都是shell腳本,只要是正確命名的可執(zhí)行腳本都能使用,Ruby、Python或其他語(yǔ)言也是可行的。
hooks目錄內(nèi)默認(rèn)包含如下文件。去掉文件后面的.example即可使用,別忘了chmod +x添加可執(zhí)行權(quán)限。
? 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
文件名已經(jīng)清楚地表述了每個(gè)鉤子的作用。我們想做的是倉(cāng)庫(kù)被push后自動(dòng)部署,所以要用到的是post-update鉤子,修改的鉤子是在/home/yourname/repos/project.git倉(cāng)庫(kù)里的鉤子,不要修改到/var/www/project里了
3. 修改鉤子
先用cp post-update.sample post-update復(fù)制一個(gè)新文件,再編輯此文件。每一行命令都已添加注釋
# 進(jìn)入項(xiàng)目目錄
cd /var/www/project
# 獲取倉(cāng)庫(kù)里的新提交
git fetch /home/yourname/repos/project.git
# 將代碼與倉(cāng)庫(kù)同步,拋棄當(dāng)前所有修改
git clean -f
git reset --hard origin/master
## 以下指令適用于laravel項(xiàng)目,可根據(jù)項(xiàng)目自由修改
# 更新依賴包
composer install
npm install
php artisan migrate
# 前端項(xiàng)目按生產(chǎn)環(huán)境生成前端文件
npm run production
最后一行命令如果遇到權(quán)限問(wèn)題,則需要將用戶添加到www-data中。使用命令usermod -G www-data yourname,并在最后一行添加chgrp www-data . -R