2013-10-30 28 views
5

我的問題最好用一個示例來描述。如何設置我的git存儲庫以便輕鬆地重新使用Visual Studio中的項目

假設我有一個項目「A」。

我也有一個項目「B」取決於「A」。

另一個項目「C」也依賴於「A」。

我的「主」項目依賴於「B」和「C」。它也可能是它也直接取決於「A」。

看起來有點像"dreaded diamond of inheritance"當 「主」 == 「d」

dreaded diamond of inheritance

這些是我的要求:

  • 我希望能夠編輯項目「A」,「B」和「C」在「main」解決方案中的內容並提交更改(即我不想只包括DLL而是代碼)。但是因爲「B」和「C」都依賴於「A」,所以應該強制他們引用相同的提交。

  • 項目「A」,「B」和「C」很可能也會被其他項目引用,所以我不能承擔項目「main」的工作目錄的所有權。

  • 此外,應該可以將每個項目的存儲庫與外部存儲庫同步。

  • 的項目「A」,「B」,「C」和「主」應該是

如何做我需要設置我的倉庫來做到這一點?

+0

那麼,你不可能配置B和C的路徑到D?聽起來對我來說這是最簡單的解決方案,如果你可以擺動它。 – jthill

+0

@jthill「B」和「C」不僅用於「D」,也可能用於其他項目。他們每個人都可以使用不同版本的「B」和「C」。因此,如果我不想在編譯項目「D」之前查看「B」和「C」的正確版本,我不能簡單地將它們放在兄弟文件夾中並使用相對路徑。 – Onur

+0

哎呀,對不起,我假設「A」是最高級的項目。無論哪種方式,如果你想要一個普通的版本,只需要在一個地方簽出並配置所有需要它的地方。 – jthill

回答

5

使用submodules approach,我會推薦的模型,其中包括依賴的列表,而不是依賴關係的層次結構:

創建「parent」回購,其中你「git submodule add」子模塊對於DCBA

parent 
    D 
    C 
    B 
    A 

添加任何符號鏈接(even in Windows)你需要爲每個項目編譯(意思是從它們自己的結構中找到它們的依賴關係的來源)。

parent」回購將引用SHA1的確切列表,表示每個依賴項的確切列表,其確切版本需要項目在父回購的歷史中的特定時間進行編譯/運行。

而且,正如我在「true nature of submodules」解釋,你可以讓你在ABCD想要的任何修改,並推動各自upstream repo
但是,您不能忘記回到parent回購協議,添加並提交代表相關回購協議A,B,CD的新狀態的SHA1修改。

這是一個component approach,其具有解決任何重疊依賴性的優勢在於:如果BC需要不同版本的A,所述parent回購將必須選擇一個(並且只有一個)的A版本。

要添加到OP厄尼爾的回答是:

依賴關係必須是相對於

不一定:您可以將子模塊中添加符號鏈接,如果它需要看到另外一個固定的路徑。

創建「user」庫

如何自動檢查出正確的庫,例如中一旦你已經確定的有效開始版本A和B的A和B在上述

的設置,您可以創建和「父」背景下推動專門爲他們使用的分支。
然後你make those submodule follow that branch,意思是任何git submodule update --remote將簽出子模塊AB的專用分支的最新SHA1。

+0

我添加了一個新的「答案」,以確保我明白你的意思。隨意編輯它。 – Onur

+0

@Onur我編輯了*我的*回答,以解答您作爲「答案」發佈的意見和問題。 – VonC

+0

我更新了「用戶」項目的工作流程。我仍然不確定我只能使用我需要的庫,而不是所有可用的庫。 – Onur

3

只是爲了確保我理解你的做法:

事情,我需要做的建立庫的儲存庫:

  1. 創建「父」庫
  2. 每個庫創建一個子模塊
  3. 相關性必須是相對的,即如果D取決於B,路徑應該看起來像../../B/某些文件夾
  4. 父存儲庫中的每個提交代表一個val圖書館的ID組合

事情,我需要做的,包括庫的選擇集到一個新項目:

  1. 創建「用戶」庫
  2. 在各自所需要的庫建立一個新分支存儲庫(例如A和B),如「for_user」,並跟蹤「用戶」項目中的子模塊。
  3. 在「父」存儲庫中創建一個「from_user」分支,用於跟蹤所使用庫的更改(是否可以跟蹤每個分支庫上的存儲庫分支?)。
  4. 包括所選的一組庫,例如, A和B來自「for_user」分支。
  5. 在A和/或B中進行的更改會轉到此分支,並且可能會合併到「父」主分支中(如果適合和/或合併到使用這些庫的其他項目的其他「from ...分支」中)。 「父」項目用於創建一致的庫集。

實際上,這是指使用這些庫的每個「用戶」項目是由一個分支代表的「從_...」在每個「父」庫「爲_...」分支使用庫存儲庫。

的設置,現在應該是這樣的

A 
    branch "for_user" 
    branch "master" (== for_parent) 
    <other branches for each project using this library> 

B,C,D 
    <like A> 


parent 
    submodule A - tracks branch dependent on the current branch 
    submodule B - tracks branch dependent on the current branch 
    <other submodules> 
    branch "master" (== from_parent) 
    branch "from_user" 
    <other branches for each project using one of the libraries> 

user 
    <own stuff> 
    submodule A - tracks branch "for_user" 
    submodule B - tracks branch "for_user" 

開放式問題:

  • 我如何自動檢查出正確的庫,例如中A和B在上面的設置?我可以檢查所有可用的庫,但會在一定程度消除了單獨的子模塊需要對每個庫
+0

開始看起來不錯。只要在'parent'回購中刪除分支「'from_user'」。 「父」回購並不知道「用戶」,只有子模塊必須遵循的一個特定分支。 – VonC

6

不要(AB)使用git或任何版本控制系統這一點。

使用NuGet

你不想直接包含其他項目。相反,將每個依賴項打包到一個.nuget包中,並將其用於依賴性處理。雖然子模塊似乎解決了這個問題,但在實踐中,使用適當的依賴關係管理而不是僅包含其他項目要好得多。

TeamCity和其他CI系統,甚至TFS,允許您自動構建新的nuget包,而TeamCity也可以充當nuget服務器。

如果你不想使用'真正'的NuGet服務器,你也可以在你的Intranet上的某個地方使用共享驅動器。

+0

我們使用NuGet來集成外部庫。但我不想建立我們自己的NuGet服務器(我們的公司政策只允許內聯網解決方案)。我發現它也可以方便地瀏覽庫源代碼。 – Onur

+0

如果您使用NuGet,您仍然可以瀏覽代碼,只需使符號(pdb)可訪問即可。如果你不想專門設置一個共享驅動器,你甚至可以使用共享驅動器作爲「nuget服務器」。我已經嘗試過以前想要的方式使用VCS - 它只是導致更多的痛苦,正確地使用像NuGet.package管理器這樣的依賴管理系統)。 – Wilbert

相關問題