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 ...
随机推荐
- php设计模式课程---2、为什么会用到简单工厂设计模式
php设计模式课程---2.为什么会用到简单工厂设计模式 一.总结 一句话总结: 比如调用数据库的语句,如果调用的数据库名字改了,或者调用的数据库类型改了(比如从Mysql用到了Mysqli),那么要 ...
- Geoserver端口冲突解决方案(二)
转载:https://blog.csdn.net/sx341125/article/details/52091903 上一篇文章说了GeoServer的安装问题,其中一个问题就是GeoServer端口 ...
- java--xml文件读取(JDOM&DOM4J)
1.JDOM解析 首先导入额外的jar包: Build Path:jdom-2.0.6.jar 准备工做获取到子节点的集合: package com.imooc_xml.jdom.text; impo ...
- Linux-awk command
简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...
- Navicate一个有用的注册码
NAVH-WK6A-DMVK-DKW3 百度直接得到,
- bootstrap-自定义导航栏隐藏参数@screen-sm
导航菜单默认在屏幕小于768px的时候自动折叠,怎么自定义这个大小? 需要重新编译bootstrap 编译 CSS 和 JavaScript 文件 问题解决!
- linux命令学习笔记(35):ln 命令
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在 不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要 ...
- node.js 安装及配置(hello world)及 node 的包管理器(npm)
下载地址:Download | Node.js,无脑下一步安装即可: 安装时,会自动将 node 可执行文件路径添加进 Path 内,这样进入 cmd 命令行,以查看 node 的安装版本: > ...
- ffmpeg编码h264只包含I帧P帧的方法
ffmpeg使用avcodc_encode_video编码,默认产生的h264包含B帧,在安防行业很多地方是不需要用到B帧的. 1.基础知识充电 这就涉及到h264的各种profile格式了,参考 h ...
- Nginx-rtmp模块实现流媒体play、push、pull功能
官方wiki:https://github.com/arut/nginx-rtmp-module#readme Nginx rtmp 功能特点 1. 支持音视频直播 2. 支持flv/mp4视 ...