2014-03-03 60 views
0

爲了我們的回購管理,我們最近從SVN切換到GIT,並且非常瞭解非線性源代碼控制風格。目前,整個代碼庫(服務的混合,Windows/Xamarin客戶端和ASP.net網站)被存入回購站,包括各種核心庫。使用GIT拆分多面C#項目

爲了進一步改善我們的工作流程,我試圖將我們所有的項目分離到他們自己的倉庫中(例如:一個用於Web服務,一個用於Windows程序等),總共大約6個單獨的項目共享一些代碼。

現在,我已經對一些不同的解決方案進行了一些研究,但我正在努力尋找折衷辦法。最後,我們希望鎖定我們核心庫的master分支,因爲它們是關鍵任務,需要通過拉請求進行同行評審。只有這樣他們纔會被接受。

我的第一個想法是使用GIT子模塊,但經過一番研究後,我發現對子樹的新概念給予了青睞。

我在某些停機時間播放了子樹,並且看不到任何方式爲父項目的不同分支選擇遠程子樹(如Core Libraries)的不同分支。

我也給了NuGet軟件包,但是可以提交併批准的可編輯源代碼的要求在這裏沒有實現。

我還沒有認真看過這裏的子模塊,所以也許他們在這裏需要固有的複雜性質?或者我錯過了什麼?

回答

0

我不能確切地告訴你的問題是什麼,但涉及:

...看不到任何的方式來選擇不同的遠程子樹的不同分支(如核心庫)父項目的分支機構。

您是否建議您想要將父項目的分支鏈接到子樹上的分支?如果所有的子項目都傾向於與超級項目同步提交,我認爲這有點像git slave,這更適合這一點。

如果您傾向於主要在超級項目上工作,偶爾會對子項目進行更改,您可以決定何時推回子項目跟蹤存儲庫,則子樹更爲理想。

認爲它有點像中間件。

您從供應商處得到一個下載,並確保您的代碼可以與任何api更改一起使用。從那一刻起,它就只是你的超級項目存儲庫的一部分。快樂地進行更改。如果你做了一件很棒的事情,並希望將其貢獻給子項目,請將其分解爲一個分支,然後將其合併到子項目的一個分支中,並從那裏發出一個請求。

定期在您開發時,您還可以從「供應商」下拉更改以更新您的子項目。

因此,我不確定這是如何設想工作流程,但您確實可以通過分支將子樹更改推送到子項目。

我會參考https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt的拆分語法和示例。 見:

多的超級項目,拉子項目到使用子樹的文件夾:


這裏是如何我想象你的工作流程「實施例3.使用分支提取的子樹」。當子項目發生變化時,他們不會自動奇蹟般地獲得更改,這很好,因爲您希望控制何時拉動,以確保一切仍然有效。

標準工作流將是你克隆主,在分支上工作,並提交更改回超級項目(實際上可能包括對子項目的更改,但超級項目仍然可以通過合併進行門控請求正常工作流程)。

也許對子項目所做的一些改變並不完整,或者只適合超級項目的當前狀態,但尚未準備好廣泛分發給其他超級項目。 在這種情況下,您可以簡單地將更改分離出來,直到其準備就緒(至少您已在超級項目中對其進行跟蹤),您可以將更改拆分爲分支。創建主子項目的分支並推送到該分支。如果你對這個子項目有很嚴格的合併要求,那就是你如何提出拉取請求,但是不要把這個問題與現在從子項目的這個分支拉到你正在工作的超級項目中混淆。你想要這樣做的唯一原因是,如果你有2個超級項目想要在你正式提交給主人之前分享子項目的工作。

+0

你提到了準備好時推回到子回購上游的想法。在我的場景中,需要在對核心庫進行更改時進行代碼審查/請求,主要是爲了確保關鍵任務不會輕易被玩弄,並且還會通知其他開發人員任何更改核心庫,如方法簽名更改和增加的功能。 –

+0

我沒有看到問題。使用子樹時,您基本上擁有多個子項目副本,並且您可以手動控制每個子項目的推送和跟蹤存儲庫。如果在超級項目的上下文中對子項目進行了更改,則仍然可以將其設置爲子項目的跟蹤存儲庫。 – johnb003

+0

我已經提交了一個備選答案,因爲我仍然認爲這個答案有它自己的優點。 – johnb003

0

如果您需要在門上的超級項目中的子項目:

你可以使用一個觸發腳本來犯什麼高手,有一個個子項目變更禁止用戶,並迫使他們如果他們需要這樣做,首先分支。然後處理對超級項目主數據的拉取請求,並自動將子項目更改拆分爲子項目跟蹤數據庫。

我認爲需要一種方式讓用戶同時對超級項目和子項目進行更改,以便跟上界面的變化。

另一方面,當您從子項目中拉出時,您必須同時更新超級項目,以便涵蓋兩種情況。

請注意,您必須從特權用戶(處理合並請求的用戶)執行子樹拉,或者用戶將必須執行建議的拉到分支並提交拉請求,因爲它將包含將觸發簽入腳本的子項目更改。