2014-03-05 62 views
1

我有一箇中央裸露的git存儲庫,我們所有的開發人員都推送到這個存儲庫。這是我們的起源。我使用origin來推送到一個單獨的,非空的存儲庫並覆蓋所有更改。這是一個示範區,所以當有人推到特定的分支時,我們可以立即看到變化。推送到非原產非Git存儲庫

Origin將推送到演示存儲庫,但工作文件不會更改。我有一個呼籲原點的後收到鉤:

git push -f ssh://[email protected]<host>/<path> <branch name> 

然後在演示回購調用我的後收到鉤:

git fetch origin <branch name> 
git reset --hard FETCH_HEAD 

如果我呼籲演示箱的命令,我的工作複製更新正常。但是從接收後(在演示回購)中調用它們會導致需要手動提交的更改。我想跳過手動更新工作副本的步驟。

我知道,通過一些google-fu和stackoverflow搜索,推送到非裸存儲庫通常是不好的做法。我瞭解風險,但我希望這能夠起作用,因爲我們使用裸倉庫作爲原產地。

是否git做一些額外的檢查,以防止工作副本更新後收到?有什麼解決方法嗎?

回答

0

有一種方法可以做到這一點吧,這將解決你的問題太多:

  1. 獨立工作現場的裸git倉庫和工作目錄,讓我們分別給他們打電話/repos/demo.git/sites/demo

  2. 推到您的演示回購像往常一樣,這部分是好的

  3. 在後收到的演示回購的鉤子,更新工作目錄有:

    git --work-tree /sites/demo reset --hard branchname 
    

    其中branchname是接收分支的名稱(即你推)

這樣你就不會違背誠實做法:您的演示回購是裸露的,所以這是完全正常的推動它。沒有git fetch步驟,這是不必要的,因爲演示回購剛剛收到提交,所以沒有任何提取。

--work-tree當然是這裏的主要技巧。它使得git命令可以在不同的地方操縱一個目錄,你也可以在裸倉庫中使用它。在掛鉤中,我認爲裸Git回購的目錄是正確設置的。如果沒有,你可以用--git-dir選項強制它:

git --git-dir /repos/demo.git --work-tree /sites/demo reset --hard branchname 
+0

啊,這看起來很有希望。在post-receive中調用fetch似乎確實很愚蠢......因爲我已經推送了代碼。使用抓取是我嘗試了大量其他組合而沒有運氣的最新嘗試。謝謝,我會放棄這一點。 – gnew

+0

就是這樣,非常感謝你的幫助。我們運行的是舊版本的git,因此我無法使用單獨的工作樹啓動回購。我可能會手動移動工作樹,以便我們擁有您所描述的裸回購。儘管如此,指定'--work-tree'選項正是我所缺少的。謝謝! – gnew