2015-04-24 48 views
2

我有一個分支叫master(生產),另一個叫development。當我推送來自主人的提交後,接收掛鉤執行:如何將推送的分支複製到另一個目錄?

git --work-tree=/var/www/mywebsite.com --git-dir=/var/repo/mywebsite.com.git checkout -f 

而且網站是活的。但我希望將我的development分支複製到/var/www/mywebsite.com.dev。

+0

上的「推送」部分您的'post-receive'掛鉤當前的樣子是什麼?它應該是從標準輸入讀取描述每個被推送到遠程的分支(實際上是ref)的行,並使用每行來構建適當的'git checkout'調用。 – chepner

+0

也許用'git archive'? – twalberg

回答

0

你想要做的是什麼工具,如Capistrano是什麼意思,他們會做得更好(例如,你的版本不是原子的,所以你的網站有一個混合的舊/新文件的而capistrano會在目錄中檢出你的樹,然後指向它的符號鏈接,這是原子的)。

如果您仍然使用「git checkout」,那麼「git checkout development」將簽出開發分支,因此您希望在您收到開發引用更新時執行此命令。該腳本將沿着線走:

#!/bin/sh 

while read old new refname 
do 
    case "$refname" in 
     refs/heads/master) 
      git --work-tree=/var/www/mywebsite.com --git-dir=/var/repo/mywebsite.com.git checkout -f 
      ;; 
     refs/heads/development) 
      git --work-tree=/var/www/mywebsite.com.dev --git-dir=/var/repo/mywebsite.com.git checkout -f refs/heads/development 
      ;; 
    esac 
done 

現在,我們可以通過多種方式提高腳本:

  • 實際上,由於鉤接收新的參考值,你甚至不需要分支名稱,並且可以使用$ new代替(如果有幾個ref更新在時間上接近彼此,則更加健壯)。

  • 爲了提高效率,我們可以保持每一個結賬索引文件(這樣未修改的文件不需要實際檢出)

  • 的--git-dir選項可以被丟棄,因爲我們是從當前目錄中檢出(掛鉤在存儲庫中執行)。

改進的腳本是:

#!/bin/sh 

while read old new refname 
do 
    case "$refname" in 
     refs/heads/master) 
      GIT_INDEX_FILE="$PWD"/index.master git --work-tree=/tmp/www/mywebsite.com checkout -f $new 
      ;; 
     refs/heads/development) 
      GIT_INDEX_FILE="$PWD"/index.development git --work-tree=/tmp/www/mywebsite.com.dev checkout -f $new 
      ;; 
    esac 
done 

在相關的主題,你也可以看看在Git的2.3引入了receive.denyCurrentBranchupdateInstead值。例如,請參閱https://github.com/blog/1957-git-2-3-has-been-released

相關問題