使用Git维护多个类似项目的最佳策略?
我有一个完整的项目 - 我们称之为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原点,但徽标的更改将不会更改为被推?
即使很不是最佳的,你可以达到你想要的东西通过部门之间的分隔文件:
- 美孚分支 - 包含独特的文件美孚
- 酒吧分支 - 包含独特的文件吧
- 共享分支 - 包含常见的文件
显然,共享的分支可以被删除,如果你决定,美孚(或酒吧)部门也将包含共享文件。
这样一来,你就可以对特定文件推到一个特定的远程:
git push <remote> <branch>
推动文件后,你必须将分支合并到一个集成分支,如果你想在同一个文件夹中查看所有文件。 所以,你的例子:
- 修复backend.js在共享的分支,并推至富和酒吧分支条
- 合并共享分支集成分支
- 修复logo.jpg,只有推到酒吧
- 合并酒吧分公司集成分支
但是,我认为这是一个恼人的工作流程,这是容易出错。
从我的经验,最好的办法是改变观念和使用多个存储库:
- 酒吧。混帐 - 包含独特的文件吧
- Foo.git - 包含独特的文件美孚
- 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。
我对子模块的问题是它们需要“静态”或“共享”代码作为“唯一”代码的子目录。这对我的项目不起作用,因为项目的根目录是共享代码,而独特的部分是一个子目录。由于我的客户使用的CI,我无法进一步重构项目(我必须将其Git服务器作为另一个远程项目添加到项目中,并在准备部署时推送代码,并且它们只在项目根目录中运行gulp文件,所以共享代码*必须*为项目根目录)。 – fdmillion
使用你的语言的包管理器,并将可重用组件分成多个包并在两个包中使用它们? –
虽然我无法为您的问题提供一个很好的答案,但您可能需要查看“git submodules”和“git subtree” – lucanLepus
根据我的经验,分支是用于特征的。存储库用于项目。项目可以包括,通过包管理器(私人npm注册表)共同的共享库,或者如果你坚持git,使用git子模块。 (或者甚至复制粘贴的样板文件。)拥有白标签项目的想法似乎很诱人,并且您“只需要几次更改”即可启动一个新项目。这很少,如果从来没有的话,将解决。这里没有最好的策略。 – k0pernikus