2017-08-11 134 views
0

我有一個完整的項目 - 我們稱之爲Foo。它託管在我自己的Gogs服務器上。使用Git維護多個類似項目的最佳策略?

現在,我有一個請求來創建項目的衍生物,我們將其稱爲Bar。 Foo和Bar項目將共享其大部分代碼庫。

但是,Foo和Bar項目的資產必須與每個項目不同。 (像圖片,CSS文件等)

我知道我可以複製我的Foo repo並在我的Gogs服務器上創建一個Bar存儲庫,然後將Foo repo作爲第二個遠程添加到酒吧項目。但是,我不清楚的是保持某些文件分離的最佳策略,同時允許共享其他文件的更改。

示例:如果我修復了「backend.js」,我希望能夠將這一更改應用於這兩個存儲庫。但是,如果我更改「assets/logo.jpg」,我希望該更改僅適用於進行更改的回購。

因此,假設我在Bar上做了兩個提交:一個更改了徽標,另一個更改了徽標修復backend.js中的錯誤。除了櫻桃採摘文件和手動來回移動文件之外,還有更好的方法來設置它,以便將backend.js文件的更改推送到Foo原點,但徽標的更改將不會更改爲被推?

+1

使用你的語言的包管理器,並將可重用組件分成多個包並在兩個包中使用它們? –

+0

雖然我無法爲您的問題提供一個很好的答案,但您可能需要查看「git submodules」和「git subtree」 – lucanLepus

+0

根據我的經驗,分支是用於特徵的。存儲庫用於項目。項目可以包括,通過包管理器(私人npm註冊表)共同的共享庫,或者如果你堅持git,使用git子模塊。 (或者甚至複製粘貼的樣板文件。)擁有白標籤項目的想法似乎很誘人,並且您「只需要幾次更改」即可啓動一個新項目。這很少,如果從來沒有的話,將解決。這裏沒有最好的策略。 – k0pernikus

回答

0

即使很不是最佳的,你可以達到你想要的東西通過部門之間的分隔文件:

  1. 美孚分支 - 包含獨特的文件美孚
  2. 酒吧分支 - 包含獨特的文件吧
  3. 共享分支 - 包含常見的文件

顯然,共享的分支可以被刪除,如果你決定,美孚(或酒吧)部門也將包含共享文件。

這樣一來,你就可以對特定文件推到一個特定的遠程:

git push <remote> <branch> 

推動文件後,你必須將分支合併到一個集成分支,如果你想在同一個文件夾中查看所有文件。 所以,你的例子:

  • 修復backend.js在共享的分支,並推至富和酒吧分支條
  • 合併共享分支集成分支
  • 修復logo.jpg,只有推到酒吧
  • 合併酒吧分公司集成分支

但是,我認爲這是一個惱人的工作流程,這是容易出錯。

從我的經驗,最好的辦法是改變觀念和使用多個存儲庫:

  1. 酒吧。混帳 - 包含獨特的文件吧
  2. Foo.git - 包含獨特的文件美孚
  3. Shared.git - 包含常見的文件(可以刪除,如果你決定共同文件Foo.git或Bar.git的一部分)

它比分支更容易,因爲文件完全分開,所有文件一起暴露,您不必進行合併或記住要推送哪個遠程。

問題是如何管理多個GIT之間的集成以及如何與其他用戶共享更改。我會建議使用多個存儲庫的工具。

GIT有子模塊功能,它允許你 「實例」 一主Git倉庫內的其他Git倉庫:

https://git-scm.com/docs/git-submodule

或者GIT樹:

https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree

但是,最重要的,我認爲使用Google REPO是最好的開源選項:

https://source.android.com/source/using-repo

這是管理多個Git倉庫的Android項目由谷歌開發的一款工具。通常,您可以在XML文件中定義您正在使用的GIT存儲庫,並且可以爲每個GIT指定您正在使用的分支,或者您正在使用的提交數。

因此,該工具自動克隆所有GIT,並檢出XML中指定的提交編號。像往常一樣承諾並推動GIT。當您想用更改更新其他用戶時,您需要更新XML。

+0

我對子模塊的問題是它們需要「靜態」或「共享」代碼作爲「唯一」代碼的子目錄。這對我的項目不起作用,因爲項目的根目錄是共享代碼,而獨特的部分是一個子目錄。由於我的客戶使用的CI,我無法進一步重構項目(我必須將其Git服務器作爲另一個遠程項目添加到項目中,並在準備部署時推送代碼,並且它們只在項目根目錄中運行gulp文件,所以共享代碼*必須*爲項目根目錄)。 – fdmillion