此文已由作者张磊授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

前言

git 拆分仓库在网上已有的案例上来看,分为 submodule 和 subtree。 还有基于这两个方案进行改进的 subrepo、git-repo 等,当然还可以使用 npm 去管理。

准备工作

  1. 可以先阅读之前的 submodule 、 subtree 以及 subrepo 的文章

  2. git-repo 可以阅读 https://code.google.com/archive/p/git-repo/https://source.android.com/source/developing 以及网上其他内容

  3. https://www.atlassian.com/blog/git/git-project-dependencies 这里推荐了很多工具。

仓库拆分

无论是最终使用哪种方式,首先是要把代码拆开放到新仓库里。

  • 方案1:手工强拆

    把目录的代码备份,然后从主仓库删除,再将代码上传到新建的子仓库,问题在于提交历史去丢失,这个问题很严重,以后找背锅的人都难 :(。

  • 方案2:git subtree split

    使用 git subtree split -P path/to/module -b branchName,注意 branchName 不要重名,如果历史记录多的话这个比较慢,看起来是检索历史提交记录,抓出符合条件(某个文件夹下)的提交日志,具体可以查看说明文档,支持并行。这种做法主仓库的历史记录还保留提交。

  • 方案3:filter-branch

    这个命令本质上是重写提交,但是反过来想一想,如果你把指定目录之外的文件都删除了,那不就是得到一个干净的子仓库了? git filter-branch -f --prune-empty --subdirectory-filter  path/to/module。这在文件被添加的时候才会开始遍历,这样在某些情况下就比 方案2 快很多,不支持并行。

    使用举例:比如说历史记录中提交某个网站的帐号密码,又过了很多提交才发现,希望删除掉,就可以使用这个方案。这种做法也会让历史记录变的干净。

看起来方案3好用很多。

方案选择

  1. submodule 在代码频繁更新的时候,需要处理的冲突会比较多,而且一开始会比较迷惑,实际上还算简单。但是在频繁的冲突处理的过程中,无疑增大了时间消耗。submodule 本质上是子仓库自身做修改推送合并,而主仓库获取的是子仓库的最新的 commitid,对子仓库的更新仅仅是更新其 commitid。

  2. subtree 可以向正常使用 git 仓库一样操作子仓库,成员感知不到子仓库的存在,复杂度被隐藏在了维护主仓库和子仓库的同步的人那里。

  3. subrepo 需要安装相关程序,且还在发展中,虽然解决了一些 submodule 和 subtree 的问题。

  4. npm 在只是引用仓库的情况下,不失为是一种好办法,但是实际上更改频率会很高,故不考虑。

  5. git-repo 增加了学习成本,需要学习 repo 的用法,同时需要寻找安装  Windows 版本的方法,以及用于管理 Android 项目,看完官网说明就准备舍弃这个方案了。

参考

  1. https://services.github.com/on-demand/downloads/submodule-vs-subtree-cheat-sheet/

  2. https://stackoverflow.com/questions/359424/detach-move-subdirectory-into-separate-git-repository

免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 Kylin存储和查询的分片问题
【推荐】 Http接口系列:如何提高Http接口用例的数据稳定性

git 仓库拆分方案对比的更多相关文章

  1. 抛砖系列之git仓库拆分工具git-filter-repo

    最近负责把团队内的git仓库做了一次分拆,解锁一个好用的工具git-filter-repo,给大伙抛砖一波,希望以后遇到类似场景时可以信手拈来. 背景 笔者团队目前是把业务相关的java项目都放到了一 ...

  2. Git 仓库拆分

    方案对比 subtree 使用命令 git subtree split -P dirPath -b branchName 将目标文件夹的代码都保存到指定分支.试了下,该方案虽然保留了 commit,但 ...

  3. 如何将硕大笨重的git仓库拆分成灵活轻巧的模块小仓库

    方法1.拆分一个子目录为独立仓库 参考链接:https://segmentfault.com/a/1190000002548731 以前是用 filter-branch 来实现,这个需求太常见了,有人 ...

  4. git仓库拆分

    例如: # 这就是那个大仓库 big-project $ git clone git@github.com:tom/big-project.git $ cd big-project # 把所有 `co ...

  5. 【Git】原Git库拆分子目录作为新仓库,并保留log记录

    一.需求描述: 现有一个git仓库,Team A和Team B的人操作同一仓库的不同目录,Team A的dev希望Team B的dev没有权限review属于Team A的代码目录,故现需要先将这个g ...

  6. 批量修改git仓库地址脚本

    前言   公司的代码都存放在自己搭建的gitlab上面.之前由于老板升级gitlab.导致下面有个叫做"api"的groups无法访问.通过无所不能的谷歌才知道.在gitlab在某 ...

  7. Terminal,git,vim常用命令整理以及删除本地git仓库

    Terminal常用命令 目录操作 ll 打开目录列表 ls -a 打开目录下所有文件列表 cd 切换到某目录 mkdir 创建目录 rmdir 删除空目录 rm -rf 目录名字 强制删除目录 mv ...

  8. GIT 如何合并另一个远程Git仓库的文件到本地仓库里某个指定子文件夹并不丢失远程提交记录?

    问题背景:     最近在重新整理手中的一个项目,目前该项目分为PC项目,手机项目,某第三方接口项目,第三方接口服务项目和手机项目     因为之前规划的原因,原来的四个项目是分两个解决方案来管理的 ...

  9. 建立多人协作git仓库/git 仓库权限控制(SSH)

    转载文章请保留出处  http://blog.csdn.net/defeattroy/article/details/13775499 git仓库是多人协作使用的,可以基于很多种协议,例如http.g ...

随机推荐

  1. ML2 Extension Manager

    The extension manager for ML2 was introduced in Juno (more details can be found in the approvedspec) ...

  2. linux 各个文件系统之间的关系

    linux 系统的各个文件系统是内置于内核中的,用vfs屏蔽了各个文件系统对于文件操作的差异,用户进程是通过系统调用来操作文件系统中的文件的.

  3. form表单提交信息的方式

    form表单提交信息的方法有两种,一种是get,一种是post.get提交的数据是在地址栏上提交,一般隐私数据不会选择这样方式.地址栏上只能提交字符. 如果使用的是post提交,那么信息都在消息正文中 ...

  4. appium界面元素介绍

    一.主窗口 主页面顶部从左到右依次是: AndroidSettings:android相关的设置 GeneralSettings:全局设置,设置appium相关的内容 DeveloperSetting ...

  5. gradle_学习_00_资源贴

    一.官方资料 1.Gradle User Guide 中文版 二.精选资料 1.Gradle学习系列之一——Gradle快速入门 2.Gradle教程

  6. Linux基本语法

    Shell编程 摘要: Shell历史 Shell的作用是解释用户的命令,用户输入一条命令,Shell就解释执行一条,这条方式称为交互式(interactive),Shell还有一种执行命令的方式称为 ...

  7. 使用myeclipes制造属于自己的jar

    选定你需要在jar中包含的package或者class 步骤1:右键export导出, 步骤2:导出类型为java --JRE  file. 步骤3:直接finish即可完成 如果希望你的jar带源码 ...

  8. nodejs 解析 base64 文本

    使用Buffer对象,在创建Buffer,指定源的编码方式 Buffer.from(data, 'base64').toString(); 当然如果是解析图片或者二进制数据的话,就不需要toStrin ...

  9. codeforces 653B B. Bear and Compressing(dfs)

    题目链接: B. Bear and Compressing time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  10. leetcode 35 Search Insert Position(二分法)

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...