我有一個分支叫master
(生產),另一個叫development
。當我推送來自主人的提交後,接收掛鉤執行:如何將推送的分支複製到另一個目錄?
git --work-tree=/var/www/mywebsite.com --git-dir=/var/repo/mywebsite.com.git checkout -f
而且網站是活的。但我希望將我的development
分支複製到/var/www/mywebsite.com.dev。
我有一個分支叫master
(生產),另一個叫development
。當我推送來自主人的提交後,接收掛鉤執行:如何將推送的分支複製到另一個目錄?
git --work-tree=/var/www/mywebsite.com --git-dir=/var/repo/mywebsite.com.git checkout -f
而且網站是活的。但我希望將我的development
分支複製到/var/www/mywebsite.com.dev。
你想要做的是什麼工具,如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.denyCurrentBranch
新updateInstead
值。例如,請參閱https://github.com/blog/1957-git-2-3-has-been-released
上的「推送」部分您的'post-receive'掛鉤當前的樣子是什麼?它應該是從標準輸入讀取描述每個被推送到遠程的分支(實際上是ref)的行,並使用每行來構建適當的'git checkout'調用。 – chepner
也許用'git archive'? – twalberg