2017-08-11 69 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