1.利用custom_hooks的post-receive鈎子,實現自動更新
打開另外一個終端,以管理員身份進入/home/hp/文件夾,新建一個文件夾git_backup,直接git clone一個項目下來,這里我clone的是自己的測試項目test。
打開之前的終端在custom_hooks文件夾下添加post-receive的shell腳本,沒有后綴(以我的電腦路徑為例:/var/opt/gitlab/git-data/repositories/root/Test.git/custom_hooks):
修改權限:chmod 777 post-receive
也可以修改為其他權限,但要保證它可以執行(gitlab官網上說,需要修改其所有者為git,我的電腦上不這樣修改也可以執行,具體參看我的上一篇文章)。
#!/bin/sh echo "custom post receive -------------->>" dst=/home/hp/git_backup/Test cd ${dst} unset GIT_DIR git --work-tree=${dst} pull origin master
切換到另外一個終端,修改/home/hp/Test目錄及其所包含的文件屬性
為了簡化操作,我直接修改其屬性(可以不需要這么多權限,起碼要保證它可以執行),命令為: chmod -R 777 Test
2.用客戶端git來測試
此時的客戶端git和服務器端在同一台電腦上,只是目錄不同,
客戶端git目錄在/home/hp/gitTest/Test
服務器git目錄在/home/hp/git_backup/Test,如果是在兩台電腦上就可以看到更清楚。
在客戶端git目錄下修改了文件,然后提交git commit -a,添加注釋后提交到本地庫,然后git push,就可以看到服務器端的custom_hooks的post-receive鈎子被調用,執行了pull操作,這樣就達到了自動更新服務器/home/hp/gitTest/Test的git庫的目的。
以下部分可以跳過,我踩過的坑,記錄一下————————————————————————————————————
3. 利用全局hooks中的post-receive實現批量更新
當時把hooks目錄下的三個ruby版的鈎子屏蔽了,此時每個項目對應的custome_hooks里的鈎子不能生效,只能嘗試用一種笨辦法解決,就是用hooks文件下的全局鈎子。如果在客戶端push之后,post-receive被調用,這這里能調用每個項目的shell腳本去pull一遍,這樣不就可以實現自動更新了么?
思路:這里的post-receive可以是shell腳本,該腳本要實現的功能就是調用某一個目錄下的所有shell腳本,並且執行一遍。
每個shell腳本要做的事情就是更新對應項目的文件。注意:hooks文件夾下原來的三個鈎子文件不要刪除,大家先做好備份,直接改后綴名,加上.simple
思路有了,現在這用這樣的笨辦法解決:先建一個測試文件post-receive如下,修改其權限可執行
#!/bin/sh
for file in /home/hp/post_hooks_dir/* do sh $file done
采用的是絕對路徑,你可以在某個地方新建一個文件夾,然后用shell腳本去遍歷你自己的目錄,然后執行該目錄下的shell腳本。
如果收到了remote: error: cannot open .git/FETCH_HEAD: Permission denied
這樣的報錯,就自己去修改需要更新的git倉庫的文件的屬性。
正常是是這樣信息:
4.在原來的ruby版本的鈎子執行我們的shell腳本
把3中的shell腳本寫成一行,在ruby中調用,這樣就可以不影響原來的ruby全局鈎子。
參考寫成一行的方法:http://blog.sina.com.cn/s/blog_ac843e330101c55g.html
在ruby中執行shell命令:http://www.jb51.net/article/59939.htm
我們采用的是system方法來執行shell命令
為不能刪除hooks文件下的ruby鈎子:http://blog.everants.com/jie-jue-gitlabbu-xian-shi-push-eventhe-xin-fen-zhi/
可以采用在post-recevie的鈎子里執行我們的shell腳本,就可以了。
在post-receive里添加一行
system 'for file in /home/hp/post_hooks_dir/* ;do sh $file;done'
這里的目錄就是你自定義的目錄/home/hp/post_hooks_dir/,用來統一存放所有需要執行的腳本,實現工程的自動更新。建議是按照工程名,建立同名的shell腳本,每個shell腳本的內容可以參考本文1中的,只需要自己改對應的文件路徑即可。這樣全局鈎子,每次從客戶端有push過來時,會調用hooks里的post-receive鈎子,這個鈎子里會去執行我們的那句shell腳本,然后這個腳本會去/home/hp/post_hooks_dir/執行所有腳本(每個腳本對應一個項目,進行git pull origin master)。