请教大家这样的项目应该要怎么做 git 管理 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
houshengzi
V2EX    git

请教大家这样的项目应该要怎么做 git 管理

  •  
  •   houshengzi 295 天前 3882 次点击
    这是一个创建于 295 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前提:手头上准备有一个项目 project 要开发,目前规划是会开发出一个基础版本,然后这版本上线后,基于该版本会按照不同的客户需求有一些差异不大的定制化修改,可能就会出现 project-A 、project-B 甚至是 C/D/E....等多个版本。

    团队考虑了两种版本管理方式:

    1. 分支模式。 除了常见的 main/dev/release ,对于定制化的就从 main 拉出对应分支 project-A ... Z ,如果 A 有修改则拉出 feature 进行开发,开发测试完毕合回 project-A 里。 如果 main 有通用更新则按照情况从 main 合到 project-A ... Z ,同理如果 project-A 的一些功能验证过后按需也可以合回到 main 。

    2. fork 模式。 基础版本正常开发迭代,有定制的需要时则从基础版本 fork 出一个 project-A ,它可以方便地随时同步上游仓库的修改,project-A 有被用户验证过后的功能也可以向上游仓库发起 merge 请求合到基础版本中

    个人感觉分支模式到时候如果真的出现很多 project-X 分支的时候,有可能分支之间合并就乱了,也会把 git 的记录搞得很花。

    另外解决怎么安排测试也是一个大问题

    大家对以上两种模式有什么看法或建议? 或者有更合理的管理模式也可以提出供我们参考

    39 条回复    2024-12-31 13:55:17 +08:00
    zhuisui
        1
    zhuisui  
       295 天前   1
    对于 git 来说,你这两种模式没区别,都是 branch.
    你说 fork 的时候是不是指 github 上的 repo 。这时候这两者的区别在于 repo 层面的管理,包括 org 、member 、permission 什么的。

    你这种需求拆出去、合回来,用 branch 管理是最合适的,设计好各种条件下如何建分支就好了。不要用什么 cherry-pick 甚至多项目。
    newaccount
        2
    newaccount  
       295 天前   1
    1 分支模式
    已经上线运行的东西
    客户不给钱,公司没有升级的动力
    公司想升级,客户未必愿意冒风险
    基于这个理由,project-A 同步 main 这个需求不存在
    dalaoshu25
        3
    dalaoshu25  
       295 天前   1
    交付给客户的当然是 release 分支,里面可以有一些针对客户的定制,跟主线无关的。
    貌似“定制化”也应该是从 release 分支再拉出 feature 乃至 hotfix 分支。这些定制有没有需要合并回主线,另外再评估。
    GBdG6clg2Jy17ua5
        4
    GBdG6clg2Jy17ua5  
       294 天前
    从来没做过这种定制化需求的项目,很好奇怎么管理那么多不同公司需求版本的。
    xingheng
        5
    xingheng  
       294 天前   1
    无脑 fork ,定制需求更新会很低,分开管理最好,分开了也可以合并基础版本的代码,不冲突。
    flyPig9527
        6
    flyPig9527  
       294 天前
    @angryfish 各种 if 判断
    flyPig9527
        7
    flyPig9527  
       294 天前   1
    @angryfish 说错了,这种很麻烦,各个分支切换要重新装依赖,同时开发多个定制分支就很蛋疼
    liuliuliuliu
        8
    liuliuliuliu  
    PRO
       294 天前   1
    是不是应该考虑做成功能开关?不同的客户,只是哪些功能打开关闭而已
    Jonz
        9
    Jonz  
       294 天前   1
    我们应该算是分支模式。
    我主要负责标准品的开发,也就是 feature 分支开发,然后本迭代完成下发后拉 release 分支。
    特单部门的同事接到新的定制需求就会基于标准品最新的 release 分支拉个 release-xxx 需求的分支进行开发和发布。
    不过有个前提是我们的特单理论上是不会直接升级到标准品的。遇到特别严重的问题就手动把代码改过去。
    Sainnhepark
        10
    Sainnhepark  
       294 天前   1
    可以考虑把部分定制化需求用配置文件控制,如果差异确实较大,可以考虑把公共的实现放到一个 common 库,然后构建的时候构建多个版本的程序
    pangzipp
        11
    pangzipp  
       294 天前   1
    有没有可能 main 作为基准。对外提供接口
    然后定制好业务去聚合接口呢?
    0x5c0f
        12
    0x5c0f  
       294 天前   1
    今天才整理的,你应该需要的是这个
    bfdh
        13
    bfdh  
       294 天前   1
    不要拉分支,不同分支会越差越多,最后结果就是不同分支之间的修改完全没法同步/合并。
    我现在是所有项目一个分支,每个项目有自己的配置目录,根据配置进行编译。
    hzymyp
        14
    hzymyp  
       294 天前   1
    之前是按照多个分支来管理的,后来发展成了近 30 个分支的树状结构,实在受不了又改成功能开关模式了
    LemonNoCry
        15
    LemonNoCry  
       294 天前   1
    可以用分支模式,可以用目录来区分

    比如
    标准版:dev/release/preview

    客户 A: A/dev ,A/release ,A/preview
    客户 B 以此类推

    就是合并会比较繁琐

    但是一般情况不会升级,只有客户反馈等等,比如标准版已经加了其他功能,客户 A 的版本还是老版本,没有特别一般不会进行升级,
    PolarisY
        16
    PolarisY  
    &bsp;  294 天前 via Android   1
    搜一下 gitflow ,基本是业内共识规范,可以在其基础上客制化。至于你提到的切换问题,可以 clone 多个本地库互不影响呀。
    你应该基于权限考虑去设计这个规范。
    HtPM
        17
    HtPM  
       294 天前   1
    巧了,我们公司目前就是用的你提到的第一种分支模式。有一个 master 分支作为公司的线上发布 Release 版本(作为里程碑),比如 OEM 厂商 1 需要定制一个功能,就基于 Master 分支新建另一个分支,比如名称取为:master-oem1 。目前已经 144 个分支了。这种模式下暂时也没什么大问题,不过偶尔需要合并大量的代码的时候会有点痛苦,不过基本上问题不大(因为我们是小公司[doge])
    cnnblike
        18
    cnnblike  
       294 天前   1
    搞一个门禁,把所有 master 上的 commit cherry-pick 到定制分支上
    xavierchow
        19
    xavierchow  
       294 天前   1
    2 楼 @newaccount 讲的很对,相信我,一旦定制化以后,你不会有机会 merge 回来了,不同客户的需求下,分支模式并不适合。
    建议把基础版本作为一个 git template repo ,需要定开的话,直接 clone 出一个新的 repo 独自演化吧。
    k9990009
        20
    k9990009  
       294 天前 via Android   1
    现在用的分支模式。客户的代码落后 N 个大版本了,除非不更新。实际上一些好用的功能和优化会,不同分支相互合并。太痛苦了。应该考虑模块化,插件化去做
    xiejay97
        21
    xiejay97  
       294 天前 via Android   1
    最好不要用分支,会有各种各样的坑,比如包管理器的依赖不一样,而且业务代码本身逻辑是连续的,基本上定制就很难再合并,只会合并 fix 类的 commit 。
    把功能做成插件这个路子实践下来只会让代码变成山。
    当初拿什么版本中标的就拿什么版本去 clone 开发。
    vxf
        22
    vxf  
       293 天前   1
    通用的东西抽出来一个 base repo
    Belmode
        23
    Belmode  
       293 天前   1
    做过类似的,都是通过 branch 来管理的。

    最恶心的是,即使 A 业务分支已经存在的需求,B 业务分支也要,很多时候是无法简单 merge 或者 cherry-pick 的,只能手动挑选合并代码,好多定制的地方都不一样,随着时间发展,不同甲方的要求越多,就相当于一个新项目了,这时候就可以拉新仓库了。

    我和你说,这种需求往往都有很多坑,版本一个控制不好,就 G 了。
    houshengzi
        24
    houshengzi  
    OP
       292 天前
    @zhuisui #1 是的,用 branch 管理会比较方便,在同一个仓库中操作就行了。果然真正的银弹并不存在
    houshengzi
        25
    houshengzi  
    OP
       292 天前
    @newaccount #2 还真有 project-A 同步回 main 的需求。因为会有一些 feature 在 A 中经过验证了后,会合回到 main 中,再以新功能的形式宣传给其他“潜在”客户
    houshengzi
        26
    houshengzi  
    OP
       292 天前
    @dalaoshu25 # 是,也可以从 release 中拉出定制分支。 文中说 main 是因为我司这里也一直是 main 分支 ≈ release 分支的
    houshengzi
        27
    houshengzi  
    OP
       292 天前
    @nikenidage1 #8 可能有些不是功能开关能完成的。之前项目就遇到过有些排序方式客户 A 要求是时间倒序,客户 B 要求的几个列点击切换排序
    houshengzi
        28
    houshengzi  
    OP
       292 天前
    @pangzipp #11 还没试过这种模式,可以去验证一下。
    houshengzi
        29
    houshengzi  
    OP
       292 天前
    @0x5c0f #12 感谢。你这个就是 branch 模式了,我们的基础版本也是类似的 git 规范。现在是考虑怎么管理从基础版衍生出的定制化项目
    houshengzi
        30
    houshengzi  
    OP
       292 天前
    @HtPM #17 感觉你们业务也很庞大啊,已经 144 个分支。那你们的整个流程大概是什么样的?有没有从定制分支往回合的情况?
    houshengzi
        31
    houshengzi  
    OP
       292 天前
    @xavierchow #19

    @k9990009 #20

    @xiejay97 #21

    @vxf #22

    @Belmode #23

    感谢以上几位。大家的核心思路都差不多的,就不逐一回复了。收集好大家意见会拿去和团队成员继续讨论的
    newaccount
        32
    newaccount  
       292 天前
    @houshengzi #25 这种情况 cherry-pick 一下就好了吧,没必要非得 merge 把线连上
    zhuisui
        33
    zhuisui  
       292 天前
    再补充一些各类现实情况:
    - 什么情况下不能用开关控制:各定制功能客户要求不能将自己分支的源代码或功能泄漏给第三方。
    - 什么情况下不适合用开关控制:定制功能基本没有共性,但代码同时存在,存在被互相引用的风险(当然这个可以用 lint 或 review 来控制)
    - 多个定制方都需要相同的功能:1. 尽量从一开始设计好 2. 开发时,应从 base 分支创建分支,然后将该分支合并到各定制业务分支上
    - 什么情况下不要用分支管理,而是分 repo:业务的技术实现会完全分叉,不管是基础库,还是业务框架,都会变得迥异,那么就没必要使用分支来确保同一个 base 代码了
    0xD800
        34
    0xD800  
       292 天前 via Android
    有相同需求。
    简单说下我的方式,希望对你有帮助。
    1. 创建一个基础 git 工程
    2. 衍生工程基于基础工程创建

    衍生工程新增一个名为 upstream (基础工程)的 remote origin ,如果涉及基础工程的变更,需要把变更推送到 upstream ,其他工程可以更新本地 upstream 代码,然后基于 dev/release 分支创建一个更新分支,再 cherry-pick 最新的 commit ,然后合并到 dev/release 。
    2han9wen71an
        35
    2han9wen71an  
       292 天前
    我们是主产品一个仓库,每个客户有一个组织,定制化业务都是单独的仓库。

    但是我们系统是插件化的,用户提出的需求如果有共性,我们会考虑合并到主产品中,否则都是以插件加载到平台中
    HtPM
        36
    HtPM  
       292 天前
    @houshengzi 有从定制分支往回合并的情况,如果两个分支差异过大,需要多个同事配合合并,谁修改的部分会让谁来合。
    liujavamail
        37
    liujavamail  
       291 天前
    @2han9wen71an 请问下插件化使用的什么技术? 我们目前也在考虑选型, 项目是 java SpringBoot 的, 不同客户的需求不一样, 还有增值模块,得按需加载
    dxddd
        38
    dxddd  
       291 天前
    我首先意识到这并不是个 git 问题,而是一个工程化的问题。就是我有一个通用能力,但是也有若干定制能力。会发生如下情况:
    1 通用能力需要及时推广至所有客户。
    2 定制的功能随时都有可能变成通用功能。
    3 定制的功能 A 要 B 不要 C 要但是与 A 不同.....。
    4 通用能力 有些客户可能不需要,或者有些客户需要定制。
    目前这种方式无解,因为软件费用给压的太低,所以公司上层觉得能够用所谓的“通用”+“定制”节省成本,最终会搞出四不像,降低软件质量。
    我能想到比较好的解决方案就是把通用能力以 jar 的形式让别的项目进行依赖。你要是定制就在自己的工程里随便开发,如果有相似的,copy 改。如果用到通用的功能,就把 jar 引入。
    2han9wen71an
        39
    2han9wen71an  
       291 天前
    @liujavamail 我们插件化使用的 OSGI 技术,可以动态加载插件
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2771 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 08:57 PVG 16:57 LAX 01:57 JFK 04:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86