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

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

前言

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. JavaScript 的 async/await

    随着 Node 7 的发布,越来越多的人开始研究据说是异步编程终级解决方案的 async/await. 异步编程的最高境界,就是根本不用关心它是不是异步. async 函数就是隧道尽头的亮光,很多人认 ...

  2. 通过request获取ID地址的方法

    // 获取IP地址 public static String getIpAddr(HttpServletRequest request) {  String ip = request.getHeade ...

  3. 一个用 vue 写的树层级组件 vue-ztree

    最近看了大神的关于vue-ztree的博客,感觉很赞,于是摘抄下来,方便自己学习,机智girl,哈哈哈O(∩_∩)O 最近由于后台管理项目的需要,页面需要制作一个无限树的需求,我第一感就想到了插件 z ...

  4. 修改Hosts文件,禁止访问指定网页

    不知道Hosts文件什么鬼的朋友可以在网上搜索一下(大牛勿喷- -) 访问网址时,先查询本地的Hosts文件,那么如果我们将Hosts文件中的网址与IP的映射修改之后,将访问错误的IP. 如在文件尾追 ...

  5. web前端绘制0.5像素的几种方法

    最近完成了公司安排的移动web触屏开发,期间涉及到在移动设备上显示线条,最开始采用PC常用的css board属性来显示1个像素的线条,但是发现在移动设备上并不美观,参考淘宝.京东的触屏发现它们均是采 ...

  6. 表达式计算-----------eval()运算符

    1.java的eval()方法(或称之为运算符)可以将字符串解析成可以运行的javaScript代码,例如 eval()只有一个参数.如果传入的参数不是一个字符串,那么它会直接返回这个参数.如果传入的 ...

  7. ACM学习历程—HDU4415 Assassin’s Creed(贪心)

    Problem Description Ezio Auditore is a great master as an assassin. Now he has prowled in the enemie ...

  8. 51nod 1686 第K大区间 二分瞎搞

    题目: 定义一个区间的值为其众数出现的次数. 现给出n个数,求将所有区间的值排序后,第K大的值为多少. 题解: 答案明显单调,我们考虑二分答案. 转化为判定问题后我们需要观察到一个性质: 如果一个区间 ...

  9. 【算法总结】Manacher's Algorithm

    Manacher's Algorithm针对的是最长回文子串问题.对于此问题,最直接的方法是遍历每一个元素,遍历过程中以每一个字符为中心向两边扩展以寻找此字符为中心的最长回文子串.复杂度O(n2).M ...

  10. 服务端返回可执行js格式要求

    服务端返回的数据,如果有直接执行的代码,那返回的头部格式中的"Content-Type",不能为"text/plain",不然,浏览器是不会执行返回数据的. 返 ...