2012-12-19 140 views
0

我一直在搜索一整天以獲取服務器端所做的更改(例如當WordPress安裝新插件更新或某人上傳某些內容時)將被提交給我用於網站部署的Git存儲庫。這是我得到的最接近:在推送更新之前向Git存儲庫提交服務器端更新

#!/bin/sh 
git --git-dir=/home/cameronm/git/cameronmalek.git --work-tree=/home/cameronm/public_html/ checkout -f master 
git --work-tree=/home/cameronm/public_html/ diff --exit-code &>- 
if [ "$?" -ne 0 ]; then 
    git --work-tree="/home/cameronm/public_html/" add .; 
    git --work-tree="/home/cameronm/public_html/" commit -m "automated server-side update"; 
fi 

這種解決方案的問題,因爲這個職位的原因,是它所有發生在錯誤的順序。我正在尋找一種方法,在我的更新被推送之前,將其他非Git方所做的所有更改提交到活動網站目錄。原因是我希望能夠看到合併衝突,如果我試圖推動的更新覆蓋最近添加到服務器的內容。

我已經整晚試圖找出這一個。描述(和Google)是一個很難的問題,所以如果我能爲你澄清任何事情,請給我發一張便條。

感謝您提供的任何幫助!


更新!

您可以在我的Gist頁面上看到我的工作解決方案(單獨預接收和後接收鉤子)。這裏是pre-receive hookpost-receive hook

回答

0

你正在做的事情有點棘手,因爲如果有任何在那裏你沒有本地衝突或沒有衝突你不能推送到遠程分支。如果你對此感到滿意,那麼你就處於正確的軌道上。我假設你將上面的腳本設置爲你的post-recieve鉤子?您只需將其設置爲pre-recieve hook並且如果有修改則返回非零值。您可能還想向用戶回覆一條錯誤消息,告訴他發生了什麼事情。

如果發生這種情況,推送將失敗,用戶在推送之前必須拉取(因爲推送不再是快進)。

但是,您爲什麼要在之前結賬您檢查更改?

+0

我__am__罰款不能推動,如果有新的提交。事實上,這就是要點:迫使開發人員在服務器上發生更改時更仔細地查看事情。 這個問題的大部分來自於對服務器端鉤子行爲的誤解。我認爲一旦推送到服務器,它就不能通過服務器端鉤子反彈一個錯誤,並停止發生推送。 我將把它更新爲一個預接收鉤子,該鉤子返回一個錯誤,並在工作目錄不乾淨時阻止推送,並避免自動提交更改。 –

+0

我可以幫助:) – Chronial