2013-10-29 63 views
1

我使用git發佈網站。 工作流程大致是:在Web服務器上git checkout修改太多文件

$ git add my_file 
$ git commit -m comment my_file 
$ git push # Just house-keeping, goes to my master repo 
$ git push ssh://[email protected]//var/www/repo.git 

一個後收到鉤看起來是這樣的:

#!/bin/bash 

working=$(pwd) 
working=${working##*/} 
working=../${working%.*} 
while read oldrev newrev ref ; do 
    branch=$(echo ${ref} | cut -d/ -f3) 
    GIT_WORK_TREE=${working} git checkout -f ${branch} 
done 

絕大多數情況下這工作得很好。 當我說好的時候,我的意思是,如果我添加了一個文件,那麼checkout會修改這個文件。

只有當我等待一天然後再次提交&推送時,post-receive鉤子中的git checkout纔會重新獲取我工作副本中的每個文件。它不僅需要很長時間,還會隨後使用rsync運行。

一夜之間會發生什麼事情,以便明天發生的結帳與我今天可以一遍又一遍地重複的結帳大不相同?

回答

0

你是否在使用分支機構?從你的post-receive鉤子看來,你沒有過濾你想用來託管你的網站代碼的參考。相反,它會爲每個修改過的參考文件進行結帳。如果您將一些代碼推送到另一個分支,那麼您的網站將會更新以反映這一點。我想你可能只想運行重要的裁判(可能是refs/heads/master),就是這樣。

也許改變

while read oldrev newrev ref ; do 
    branch=$(echo ${ref} | cut -d/ -f3) 
    GIT_WORK_TREE=${working} git checkout -f ${branch} 
done 

while read oldrev newrev ref ; do 
    if [ "$ref" == "refs/heads/master" ]; then 
     branch=$(echo ${ref} | cut -d/ -f3) 
     GIT_WORK_TREE=${working} git checkout -f ${branch} 
    fi 
done 
+0

我不是在所有使用分支。所以我總是看到git提到我已經在掌握了。但是,爲了消除模糊性,我將簡化post-receive鉤子。最大的問題是,它大部分時間都在運行,但如果我從最後一次推送後的一天內推出,則會失敗。 – craigemery

+0

另外:不用'cut -d/-f3',通常最好用'$ {ref#refs/heads /}'去掉'refs/heads /'',以免這樣處理一個分支名稱,例如'refs/heads/foo/bar'就好像它只是'foo'而不是'foo/bar'。在這種情況下不是問題,但是,在這種情況下,您可以執行'branch = master'。 :-) – torek

+0

是的。如果不是很明顯,我只是向他展示瞭如何設定該區塊的條件。我更喜歡使用你自己指出的符號。但是你是絕對正確的,在這種情況下,它可以被清理爲'branch = master',或者將分支名稱放在checkout命令中。 – jszakmeister