2013-10-23 33 views
0

我試圖建立一個存儲庫系統,它允許項目共享一個「框架」遠程,以便對框架的錯誤修正可以被拉入到項目中。如何才能達到拉入不是鏡像的裸倉庫的效果?

我對這樣的做法是設立一個裸倉庫處的//NAS/projects/base,在//NAS/projects/projectX將其克隆到一個純倉庫,並projectX創建的遠程重命名從originframework,以避免混亂。目的是,然後每個開發人員可以克隆//NAS/projects/projectX並將其更改推回到該存儲庫,並且框架維護人員可以克隆//NAS/projects/base並將其更改推回到該存儲庫。然後projectX可以從基地拉 - 這裏我的方法下跌,因爲我不能拉入裸倉庫。

existingquestions關於似乎表面上相似的設置,但在檢查中似乎只涉及第二個裸倉庫是第一個鏡像的情況。這是不是這裏的情況:我希望能夠創造一個projectY也使用了框架,並得到了改變,但沒有具體到projectXprojectYbase結束了任何代碼。

如何Git支持這種結構?有人需要將base作爲遠程添加到其本地存儲庫,從中拉出,然後推入projectX?我可以從base獲取projectX:是否有一些命令可以讓我們將其主人重新命名爲base的主人?還是我完全用錯誤的方式去解決這個問題?

+0

該框架是一個項目使用的庫,還是更多是編輯和/或構建的核心組件?如果它是一個庫,我會在自己的存儲庫中進行跟蹤,並將其作爲使用它的項目中的子模塊。第二個是 – cjc343

+0

@ cjc343。它在結構上不適合子模塊方法。 –

回答

1

簡短回答:您需要讓項目所有者從基地獲取本地(非裸)存儲庫,並將來自基地的錯誤修正/更新合併到他們的projectx/master分支(或將他們的主基地重新綁定到基地)。從那裏他們可以將更新的projectx狀態推回給服務器供其他人使用。 (請參閱git merging branches in a bare repository

如果我理解正確,base就像OO層次結構中的基類,並且這些項目就像派生類一樣,自動繼承對base的更改,但實現某些不同的內容是正確的?否則,如果它更像是一個「具有框架功能的基礎庫」類型的情況,那麼其他項目將引用一個獨立的項目(例如通過子模塊),正如您的問題中的評論所暗示的那樣。

你似乎需要的是一種從基礎的自動修正錯誤融入項目,所有在服務器上的裸回購。這是行不通的,因爲git用merge/rebase的錯誤消息表示(「這個操作必須在工作樹中運行」),原因很簡單:即使它可以在repo內部合併,git也不能保證在那裏在合併過程中不會發生衝突(也許有人已經在同一位置應用了不同的bug修復),並且爲了解決合併衝突,您需要手工編輯受影響的文件,爲此需要檢出工作複製。即使沒有衝突,git也不得不創建一個「臨時」工作副本來應用更改,然後再次提交。這不是git的工作原理:回購僅僅是一個時間點項目狀態的(壓縮)快照集合。你只能添加新的快照,你不會修改裏面的快照。因爲這隻會將完整的blob和引用複製到存儲庫中,以使提取的遠程分支可用,但不會修改現有的分支。)

如果您想要一個主要是自動解決方案,如果在此過程中沒有發生合併衝突,則可以使用shell腳本定期從基站獲取,將更新合併到項目中,並將更新的項目主服務器推送到服務器。但是,我建議不要這樣做,因爲如果發生並未被合併捕獲的「功能性」衝突,則會遇到問題,在這種情況下,只要項目不兼容,就必須停止自動腳本來自基地的新變化。根據這種情況的可能性,謹慎行事(在unstable_updates分支或其他地方)。