git 仓库拆分方案对比
此文已由作者张磊授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
前言
git 拆分仓库在网上已有的案例上来看,分为 submodule 和 subtree。 还有基于这两个方案进行改进的 subrepo、git-repo 等,当然还可以使用 npm 去管理。
准备工作
可以先阅读之前的 submodule 、 subtree 以及 subrepo 的文章
git-repo 可以阅读 https://code.google.com/archive/p/git-repo/ 和https://source.android.com/source/developing 以及网上其他内容
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好用很多。
方案选择
submodule 在代码频繁更新的时候,需要处理的冲突会比较多,而且一开始会比较迷惑,实际上还算简单。但是在频繁的冲突处理的过程中,无疑增大了时间消耗。submodule 本质上是子仓库自身做修改推送合并,而主仓库获取的是子仓库的最新的 commitid,对子仓库的更新仅仅是更新其 commitid。
subtree 可以向正常使用 git 仓库一样操作子仓库,成员感知不到子仓库的存在,复杂度被隐藏在了维护主仓库和子仓库的同步的人那里。
subrepo 需要安装相关程序,且还在发展中,虽然解决了一些 submodule 和 subtree 的问题。
npm 在只是引用仓库的情况下,不失为是一种好办法,但是实际上更改频率会很高,故不考虑。
git-repo 增加了学习成本,需要学习 repo 的用法,同时需要寻找安装 Windows 版本的方法,以及用于管理 Android 项目,看完官网说明就准备舍弃这个方案了。
参考
https://services.github.com/on-demand/downloads/submodule-vs-subtree-cheat-sheet/
https://stackoverflow.com/questions/359424/detach-move-subdirectory-into-separate-git-repository
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 Kylin存储和查询的分片问题
【推荐】 Http接口系列:如何提高Http接口用例的数据稳定性
git 仓库拆分方案对比的更多相关文章
- 抛砖系列之git仓库拆分工具git-filter-repo
最近负责把团队内的git仓库做了一次分拆,解锁一个好用的工具git-filter-repo,给大伙抛砖一波,希望以后遇到类似场景时可以信手拈来. 背景 笔者团队目前是把业务相关的java项目都放到了一 ...
- Git 仓库拆分
方案对比 subtree 使用命令 git subtree split -P dirPath -b branchName 将目标文件夹的代码都保存到指定分支.试了下,该方案虽然保留了 commit,但 ...
- 如何将硕大笨重的git仓库拆分成灵活轻巧的模块小仓库
方法1.拆分一个子目录为独立仓库 参考链接:https://segmentfault.com/a/1190000002548731 以前是用 filter-branch 来实现,这个需求太常见了,有人 ...
- git仓库拆分
例如: # 这就是那个大仓库 big-project $ git clone git@github.com:tom/big-project.git $ cd big-project # 把所有 `co ...
- 【Git】原Git库拆分子目录作为新仓库,并保留log记录
一.需求描述: 现有一个git仓库,Team A和Team B的人操作同一仓库的不同目录,Team A的dev希望Team B的dev没有权限review属于Team A的代码目录,故现需要先将这个g ...
- 批量修改git仓库地址脚本
前言 公司的代码都存放在自己搭建的gitlab上面.之前由于老板升级gitlab.导致下面有个叫做"api"的groups无法访问.通过无所不能的谷歌才知道.在gitlab在某 ...
- Terminal,git,vim常用命令整理以及删除本地git仓库
Terminal常用命令 目录操作 ll 打开目录列表 ls -a 打开目录下所有文件列表 cd 切换到某目录 mkdir 创建目录 rmdir 删除空目录 rm -rf 目录名字 强制删除目录 mv ...
- GIT 如何合并另一个远程Git仓库的文件到本地仓库里某个指定子文件夹并不丢失远程提交记录?
问题背景: 最近在重新整理手中的一个项目,目前该项目分为PC项目,手机项目,某第三方接口项目,第三方接口服务项目和手机项目 因为之前规划的原因,原来的四个项目是分两个解决方案来管理的 ...
- 建立多人协作git仓库/git 仓库权限控制(SSH)
转载文章请保留出处 http://blog.csdn.net/defeattroy/article/details/13775499 git仓库是多人协作使用的,可以基于很多种协议,例如http.g ...
随机推荐
- JAVA- 数据库连接池原理
第一次Java程序要在MySQL中执行一条语句,那么就必须建立一个Connection对象,代表了与MySQL数据库的连接通过直接发送你要执行的SQL语句之后,就会调用Connection.close ...
- php一维数组的创建
php一维数组的创建 (1)通过array函数声明数组 使用array 函数定义数组,该函数返回通过所接受接收的参数建立的数组.array 函数使用的格式如下. $arry_name = array( ...
- ajax页面中的前进与后台的实现
具体效果参考:http://www.zhangxinxu.com/study/201306/ajax-page-html5-history-api.html? //以下是自己的部分理解<!DOC ...
- IDEA 加载Eclipse项目
- Java8中聚合操作collect、reduce方法详解
Stream的基本概念 Stream和集合的区别: Stream不会自己存储元素.元素储存在底层集合或者根据需要产生.Stream操作符不会改变源对象.相反,它会返回一个持有结果的新的Stream.3 ...
- mq_学习_00_资源帖
一.精选 二.参考资料-基础 JMS(Java消息服务)入门教程 Sun Java System Message Queue 3.7 UR1 技术概述 消息队列-推/拉模式学习 & Activ ...
- hdu-1286 找新朋友(欧拉函数,水题)
题目链接: 找新朋友 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- django学习笔记(二)模板
1.当模板中的变量名遇到点时,以下面的顺序查找(短路逻辑): (1)字典类型查找: >>> from django.template import Template, Context ...
- linux命令学习笔记(21):find命令之xargs
xargs是一条Unix和类Unix操作系统的常用命令.它的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题 xargs的作用一般等同于大多数Unix shell中的反引号,但更 ...
- visual studio 高级选项及配置
visual studio 是一款强大的 IDE,所谓 IDE 即是将通过命令行(一系列复杂的参数选项)编译.链接等操作内置到 IDE 的界面按钮处. 为什么新建的工程,可以直接 #include & ...