惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
S
Securelist
V
Vulnerabilities – Threatpost
C
Cyber Attacks, Cyber Crime and Cyber Security
Schneier on Security
Schneier on Security
Cyberwarzone
Cyberwarzone
Simon Willison's Weblog
Simon Willison's Weblog
Hacker News - Newest:
Hacker News - Newest: "LLM"
P
Palo Alto Networks Blog
T
Troy Hunt's Blog
SecWiki News
SecWiki News
Security Archives - TechRepublic
Security Archives - TechRepublic
T
The Blog of Author Tim Ferriss
Project Zero
Project Zero
Microsoft Security Blog
Microsoft Security Blog
The Register - Security
The Register - Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
J
Java Code Geeks
F
Full Disclosure
阮一峰的网络日志
阮一峰的网络日志
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Attack and Defense Labs
Attack and Defense Labs
Know Your Adversary
Know Your Adversary
WordPress大学
WordPress大学
PCI Perspectives
PCI Perspectives
N
News | PayPal Newsroom
The Last Watchdog
The Last Watchdog
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Privacy & Cybersecurity Law Blog
P
Proofpoint News Feed
V
Visual Studio Blog
C
CERT Recently Published Vulnerability Notes
H
Help Net Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
云风的 BLOG
云风的 BLOG
月光博客
月光博客
T
The Exploit Database - CXSecurity.com
I
InfoQ
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
U
Unit 42
腾讯CDC
小众软件
小众软件
V2EX - 技术
V2EX - 技术
罗磊的独立博客
Cloudbric
Cloudbric
Recorded Future
Recorded Future
IT之家
IT之家
Google DeepMind News
Google DeepMind News
C
CXSECURITY Database RSS Feed - CXSecurity.com

git

请教一个诡异的 git 问题 - V2EX 有一个 git 仓库合并问题,不知道怎么办才好 分析一个技巧让同事不知道我使用了 ai : git 忽略本地改动文件,实现不提交 Rebased, 一个 git 客户端 发现一个邪修快速清理 Git 项目里面空文件夹的方法🤡 不知道有没有什么其他标准做法. - V2EX zig 写的 100kb 的 wasm 可以 http 读写任意 git 仓库 - V2EX 有人把 IDEA 的 git 客户端做出来了 问个关于 rebase 和 github pr 的奇怪的问题 - V2EX idea 同款 git 客户端求推荐 - V2EX 有没有类似 JB 家的 Git 管理工具 - V2EX 大家自己的代码都是放在哪儿 - V2EX 分享一个在 Linux 上编译静态 Git 二进制的项目 - V2EX 上亿的 git 仓库如何做冷热存储分离呢 - V2EX 发现了一个极度臃肿的项目 - V2EX 有什么支持直接连接远程主机 git 仓库的 GUI 工具吗 - V2EX KFCode 官网上线,做好用、靠谱、有趣的 Git 托管平台 - V2EX git 工作流,大家现在用的什么样的? - V2EX 很奇怪的一个现象,有没人知道是怎么回事,所有 LLM 都说 100%不会出现 - V2EX 我宣布,最好的 git 客户端是腾讯家的 ugit - V2EX Fork 付费版有什么不同? - V2EX 一位高级工程师的 GIT 需要熟悉到什么程度? - V2EX 已经 push 到远程仓库的提交,如何修改某个用户的所有提交的邮箱啊 - V2EX [求助下] 关于代码同步问题 - V2EX 一直不理解 Windows 下 git 的这个逻辑,我自己 clone 的仓库还不能删了? rm -force 也不行 - V2EX 分享一个 Git 存储库治理利器 - hot - V2EX 代码有没有必要备份到多个远程仓库?比如 github 和 codeup。有必要的话最好怎么备份? - V2EX 请教 git 里怎么删除记录 - V2EX git 中如何将子分支的多个提交作为一个提交合并到主分支? - V2EX git 切换分支问题 - V2EX git 各种命令执行很慢是什么原因导致的? - V2EX 有没有大佬指导一下 git 问题 - V2EX git remotes 分支克隆 - V2EX 两处修改需要分开提交吗? - V2EX 问个 Git 基操:怎么样复制一个文件,能保持历史记录? - V2EX Linux 的 Ubuntu 系统有类似 Sourcetree 或者 fork 这种 git 图形化操作的客户端工具吗 - V2EX 关于刚刚 git 的问题描述的不清楚,不能编辑主题了,重新发下问题: git 如何对比服务器上最新的代码和本地的区别? git diff 对比和我预想不一样 - V2EX git 新手求教: git 如何对比服务器上最新的代码和本地的区别?不是本地远端和本地 working。 svn 可以使用 show log,直接对比,调用 beyond compare 很方便。 - V2EX 对上游提 pr,上游的管理员觉得 pr 里面的功能他不需要或者不满意 - V2EX gitee fork 时继承推送规则是否合理? - V2EX 请教各位关于 Git 合并的问题 - V2EX 请教大家一个测试环境代码合并的问题 - V2EX 推送远程仓库导致本地提交记录消失,如何找回 - V2EX 给上游 pr,自己应该先 pr 到自己的 main 分支吗? - V2EX 请教一个开发流程中 GIT 解决冲突的问题 - V2EX 求教:在 fork 的仓库上添加不太可能被 upstream 接受的修改,是不是应该在新开的 branch 上开发? - V2EX 有哪个 git 的 gui 软件。可以像 idea 的 git 管理那样查看文件历史和代码冲突?现在换到了 cursor,但是这边的代码管理个人用的太不习惯了。 - V2EX git clean 还能找回吗 - V2EX 求助 git 自动 merge 丢代码 - V2EX 码云代码自动同步到 github - V2EX 从本地提交代码到 gitlab 后, diff 异常问题,求大佬解惑 - V2EX 在 Git 中,已知某一个分支的某个 Commit 引入了一个 bug,如何快速确定这个 bug 是经过哪些分支流转到 master 分支的? git rebase 那么重要么??? 如何在 git 提交前将生产版本和开发版本的配置进行区分 开源了个新的版本控制系统 HugeSCM,请 V 友们指导 Git Permission denied 问题求助
请教大家这样的项目应该要怎么做 git 管理 - V2EX
houshengzi · 2024-12-27 · via git

这是一个创建于 534 天前的主题,其中的信息可能已经有所发展或是发生改变。

前提:手头上准备有一个项目 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 的记录搞得很花。

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

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

  • git
  • 管理
  • 测试

    39 条回复    2024-12-31 13:55:17 +08:00

    zhuisui

    1

    zhuisui      2024 年 12 月 27 日   ❤️ 1

    对于 git 来说,你这两种模式没区别,都是 branch.
    你说 fork 的时候是不是指 github 上的 repo 。这时候这两者的区别在于 repo 层面的管理,包括 org 、member 、permission 什么的。

    你这种需求——拆出去、合回来,用 branch 管理是最合适的,设计好各种条件下如何建分支就好了。不要用什么 cherry-pick 甚至多项目。

    newaccount

    2

    newaccount      2024 年 12 月 27 日   ❤️ 1

    1 分支模式
    已经上线运行的东西
    客户不给钱,公司没有升级的动力
    公司想升级,客户未必愿意冒风险
    基于这个理由,project-A 同步 main 这个需求不存在

    dalaoshu25

    3

    dalaoshu25      2024 年 12 月 27 日   ❤️ 1

    交付给客户的当然是 release 分支,里面可以有一些针对客户的定制,跟主线无关的。
    貌似“定制化”也应该是从 release 分支再拉出 feature 乃至 hotfix 分支。这些定制有没有需要合并回主线,另外再评估。

    xingheng

    5

    xingheng      2024 年 12 月 27 日   ❤️ 1

    无脑 fork ,定制需求更新会很低,分开管理最好,分开了也可以合并基础版本的代码,不冲突。

    liuliuliuliu

    8

    liuliuliuliu      2024 年 12 月 27 日   ❤️ 1

    是不是应该考虑做成功能开关?不同的客户,只是哪些功能打开关闭而已

    Jonz

    9

    Jonz      2024 年 12 月 27 日   ❤️ 1

    我们应该算是分支模式。
    我主要负责标准品的开发,也就是 feature 分支开发,然后本迭代完成下发后拉 release 分支。
    特单部门的同事接到新的定制需求就会基于标准品最新的 release 分支拉个 release-xxx 需求的分支进行开发和发布。
    不过有个前提是我们的特单理论上是不会直接升级到标准品的。遇到特别严重的问题就手动把代码改过去。

    Sainnhepark

    10

    Sainnhepark      2024 年 12 月 27 日   ❤️ 1

    可以考虑把部分定制化需求用配置文件控制,如果差异确实较大,可以考虑把公共的实现放到一个 common 库,然后构建的时候构建多个版本的程序

    pangzipp

    11

    pangzipp      2024 年 12 月 27 日   ❤️ 1

    有没有可能 main 作为基准。对外提供接口
    然后定制好业务去聚合接口呢?

    0x5c0f

    12

    0x5c0f      2024 年 12 月 27 日   ❤️ 1

    今天才整理的,你应该需要的是这个

    bfdh

    13

    bfdh      2024 年 12 月 27 日   ❤️ 1

    不要拉分支,不同分支会越差越多,最后结果就是不同分支之间的修改完全没法同步/合并。
    我现在是所有项目一个分支,每个项目有自己的配置目录,根据配置进行编译。

    hzymyp

    14

    hzymyp      2024 年 12 月 27 日   ❤️ 1

    之前是按照多个分支来管理的,后来发展成了近 30 个分支的树状结构,实在受不了又改成功能开关模式了

    LemonNoCry

    15

    LemonNoCry      2024 年 12 月 27 日   ❤️ 1

    可以用分支模式,可以用目录来区分

    比如
    标准版:dev/release/preview

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

    就是合并会比较繁琐

    但是一般情况不会升级,只有客户反馈等等,比如标准版已经加了其他功能,客户 A 的版本还是老版本,没有特别一般不会进行升级,

    PolarisY

    16

    PolarisY      2024 年 12 月 27 日 via Android   ❤️ 1

    搜一下 gitflow ,基本是业内共识规范,可以在其基础上客制化。至于你提到的切换问题,可以 clone 多个本地库互不影响呀。
    你应该基于权限考虑去设计这个规范。

    HtPM

    17

    HtPM      2024 年 12 月 27 日   ❤️ 1

    巧了,我们公司目前就是用的你提到的第一种分支模式。有一个 master 分支作为公司的线上发布 Release 版本(作为里程碑),比如 OEM 厂商 1 需要定制一个功能,就基于 Master 分支新建另一个分支,比如名称取为:master-oem1 。目前已经 144 个分支了。这种模式下暂时也没什么大问题,不过偶尔需要合并大量的代码的时候会有点痛苦,不过基本上问题不大(因为我们是小公司[doge])

    cnnblike

    18

    cnnblike      2024 年 12 月 27 日   ❤️ 1

    搞一个门禁,把所有 master 上的 commit cherry-pick 到定制分支上

    xavierchow

    19

    xavierchow      2024 年 12 月 27 日   ❤️ 1

    2 楼 @newaccount 讲的很对,相信我,一旦定制化以后,你不会有机会 merge 回来了,不同客户的需求下,分支模式并不适合。
    建议把基础版本作为一个 git template repo ,需要定开的话,直接 clone 出一个新的 repo 独自演化吧。

    k9990009

    20

    k9990009      2024 年 12 月 28 日 via Android   ❤️ 1

    现在用的分支模式。客户的代码落后 N 个大版本了,除非不更新。实际上一些好用的功能和优化会,不同分支相互合并。太痛苦了。应该考虑模块化,插件化去做

    xiejay97

    21

    xiejay97      2024 年 12 月 28 日 via Android   ❤️ 1

    最好不要用分支,会有各种各样的坑,比如包管理器的依赖不一样,而且业务代码本身逻辑是连续的,基本上定制就很难再合并,只会合并 fix 类的 commit 。
    把功能做成插件这个路子实践下来只会让代码变成💩山。
    当初拿什么版本中标的就拿什么版本去 clone 开发。

    vxf

    22

    vxf      2024 年 12 月 28 日   ❤️ 1

    通用的东西抽出来一个 base repo

    Belmode

    23

    Belmode      2024 年 12 月 28 日   ❤️ 1

    做过类似的,都是通过 branch 来管理的。

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

    我和你说,这种需求往往都有很多坑,版本一个控制不好,就 G 了。

    houshengzi

    24

    houshengzi      2024 年 12 月 30 日

    @zhuisui #1 是的,用 branch 管理会比较方便,在同一个仓库中操作就行了。果然真正的银弹并不存在

    houshengzi

    25

    houshengzi      2024 年 12 月 30 日

    @newaccount #2 还真有 project-A 同步回 main 的需求。因为会有一些 feature 在 A 中经过验证了后,会合回到 main 中,再以新功能的形式宣传给其他“潜在”客户

    houshengzi

    26

    houshengzi      2024 年 12 月 30 日

    @dalaoshu25 # 是,也可以从 release 中拉出定制分支。 文中说 main 是因为我司这里也一直是 main 分支 ≈ release 分支的

    houshengzi

    27

    houshengzi      2024 年 12 月 30 日

    @nikenidage1 #8 可能有些不是功能开关能完成的。之前项目就遇到过有些排序方式客户 A 要求是时间倒序,客户 B 要求的几个列点击切换排序

    houshengzi

    29

    houshengzi      2024 年 12 月 30 日

    @0x5c0f #12 感谢。你这个就是 branch 模式了,我们的基础版本也是类似的 git 规范。现在是考虑怎么管理从基础版衍生出的定制化项目

    houshengzi

    30

    houshengzi      2024 年 12 月 30 日

    @HtPM #17 感觉你们业务也很庞大啊,已经 144 个分支。那你们的整个流程大概是什么样的?有没有从定制分支往回合的情况?

    zhuisui

    33

    zhuisui      2024 年 12 月 30 日

    再补充一些各类现实情况:
    - 什么情况下不能用开关控制:各定制功能客户要求不能将自己分支的源代码或功能泄漏给第三方。
    - 什么情况下不适合用开关控制:定制功能基本没有共性,但代码同时存在,存在被互相引用的风险(当然这个可以用 lint 或 review 来控制)
    - 多个定制方都需要相同的功能:1. 尽量从一开始设计好 2. 开发时,应从 base 分支创建分支,然后将该分支合并到各定制业务分支上
    - 什么情况下不要用分支管理,而是分 repo:业务的技术实现会完全分叉,不管是基础库,还是业务框架,都会变得迥异,那么就没必要使用分支来确保同一个 base 代码了

    0xD800

    34

    0xD800      2024 年 12 月 30 日 via Android

    有相同需求。
    简单说下我的方式,希望对你有帮助。
    1. 创建一个基础 git 工程
    2. 衍生工程基于基础工程创建

    衍生工程新增一个名为 upstream (基础工程)的 remote origin ,如果涉及基础工程的变更,需要把变更推送到 upstream ,其他工程可以更新本地 upstream 代码,然后基于 dev/release 分支创建一个更新分支,再 cherry-pick 最新的 commit ,然后合并到 dev/release 。

    2han9wen71an

    35

    2han9wen71an      2024 年 12 月 30 日

    我们是主产品一个仓库,每个客户有一个组织,定制化业务都是单独的仓库。

    但是我们系统是插件化的,用户提出的需求如果有共性,我们会考虑合并到主产品中,否则都是以插件加载到平台中

    HtPM

    36

    HtPM      2024 年 12 月 30 日

    @houshengzi 有从定制分支往回合并的情况,如果两个分支差异过大,需要多个同事配合合并,谁修改的部分会让谁来合。

    liujavamail

    37

    liujavamail      2024 年 12 月 30 日

    @2han9wen71an 请问下插件化使用的什么技术? 我们目前也在考虑选型, 项目是 java SpringBoot 的, 不同客户的需求不一样, 还有增值模块,得按需加载

    dxddd

    38

    dxddd      2024 年 12 月 31 日

    我首先意识到这并不是个 git 问题,而是一个工程化的问题。就是我有一个通用能力,但是也有若干定制能力。会发生如下情况:
    1 通用能力需要及时推广至所有客户。
    2 定制的功能随时都有可能变成通用功能。
    3 定制的功能 A 要 B 不要 C 要但是与 A 不同.....。
    4 通用能力 有些客户可能不需要,或者有些客户需要定制。
    目前这种方式无解,因为软件费用给压的太低,所以公司上层觉得能够用所谓的“通用”+“定制”节省成本,最终会搞出四不像,降低软件质量。
    我能想到比较好的解决方案就是把通用能力以 jar 的形式让别的项目进行依赖。你要是定制就在自己的工程里随便开发,如果有相似的,copy 改。如果用到通用的功能,就把 jar 引入。