2015-11-04 63 views
0

比方說,我在服務器/鉤夾兩個腳本:呼叫從一個git腳本勾

第一個啓動的日誌記錄和寫關於推進的基本信息:(後接收)

#!/bin/sh 
read oldrev newrev refname 
LOGFILE=post-receive.log 
echo " push - Old SHA: $oldrev -> $newrev >> $LOGFILE 
sh ./post-receive-logic >> $LOGFILE 

二一個不實際的部署:(後接收邏輯)

#!/bin/sh 
cd ~/proj 
pm2 stop ~/proj/main.js 
git --git-dir ~/proj/.git --work-tree ~/proj pull 
npm install 
pm2 restart ~/proj/main.js 
echo "finished" 

當我推提交,第二個腳本不會被調用:在工作樹沒有變化,沒有服務器被殺害並重新啓動,沒有具體的輸出到第二個腳本。

如果我手動撥打./post-receive-logic,一切正常,服務器停止,文件被拉,服務器再次啓動。

我試圖把它不sh,就像這樣:

./post-receive-logic >> $LOGFILE 

,但沒有運氣。

我在做什麼錯?

+0

這兩個腳本的權限是否相同? – houtanb

+1

您是否嘗試使用腳本的完整路徑? – houtanb

+0

@HBHB OH我沒有想到,sctipts是從repository root調用的,我應該寫'./hooks/post-receive-logic >> $ LOGFILE'。 – amdc

回答

2

練習:在接收掛鉤操作期間,.(或$PWD)在哪裏?

運行它,它是什麼$PWD是。什麼時候自動運行? (看一下接收系統的裸Git倉庫:你的$LOGFILE輸出將在該目錄中。)

(您的帖子中的鉤子文本中沒有關閉引號,所以可能是您手動複製了某個部分),也許還有一些其他的東西丟失了,另外,確保鉤子有執行權限,但我的猜測是你被git運行鉤子$PWD設置爲.git目錄而不是鉤子目錄)

(旁註:你的鉤子可能是不完整的,因爲它只能讀取一個oldrev newrev refname,但git push可以推動很多裁判通常你應該循環:。while read oldrev newrev refname; do ...; done如果你有一個預先-R eceive鉤拒絕推送多於一個ref,但是,這個特定的post-receive鉤子可能是正確的。)

+0

完全忘記了$ PWD作爲版本庫的根目錄,謝謝!至於缺少的報價,這是因爲我在複製粘貼上不好。 – amdc