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

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

前言

目前对 git 仓库拆分的已有实现之一,并没有合并到 git 发行版中。项目的地址是 https://github.com/ingydotnet/git-subrepo

准备工作

  1. 首先创建主仓库 subrepo-master,随意提交一次文本,接着拉取到本地

  2. 建立子仓库 subrepo 和 subrepo1,随意提交一次文本

  3. Windows 安装稍显麻烦,通过安装 Cygwin ,并配置环境解决的。

操作

  1. 添加子仓库

    git subrepo clone <repository> [<subdir>] [-b <upstream-branch>] [-f]  这里的 repository 可以用添加的 remote 的别名。子仓库添加完成,会发现目录多了一个,而且进去后发现有一个文件 .gitrepo,打开看到记录了 subrepo 执行的一些信息。同时运行 git log 发现多了一次提交。由于存在 .gitrepo 文件,就不需要像 git-subtree 一样每次都要指定 remote url,后续可以直接用目录名更新。

     git subrepo clone (merge) --branch=a subtree1 subtree1
     subrepo:   subdir:   "subtree1"   merged:   "8a62c0e" upstream:   origin:   "subtree1"   branch:   "a"   commit:   "8a62c0e"
     git-subrepo:   version:  "0.4.0"   origin:   "???"   commit:   "???"
  2. 更新子仓库

    对子仓库远端做一次修改,然后更新它。git subrepo pull subrepo1,接着运行 git log,会发现这里像添加子仓库一样自动做了一次提交

  3. 修改主仓库、子仓库

    对主仓库、子仓库做修改并提交,同时修改远端主仓库、子仓库。这里如果有冲突,修改冲突的地方有点奇怪,是放在 .git/tmp/<dir> 下面,仔细看提示步骤,按照步骤走就可以顺利提交了。不过在这里也可以体验看设计思路,确实有兼容 git-subtree 和 git-submodule。

缺点

  1. 文档有点少,好在项目还有些活跃

  2. Windows 下安装麻烦,体验极差,绝望

优点

  1. 把官网的罗列搬出来即可(谷歌翻译+人工),而且只看命令确实挺有吸引力的

    它假定人们与仓库交互有三个主要角色,并试图为他们提供一切服务:

  2. 所有者 - 作者/拥有/维护仓库的人。

    用户 - 刚刚使用/安装仓库的用户。

    合作者 - 将代码提交给仓库和子仓库的人员。

    该 git-subrepo 命令通过以下方式为这些角色带来好处:

    简单而直观的命令行使用。

    用户只需克隆仓库就可以获得仓库和所有的子仓库。

    用户不需要安装 git-subrepo,永远。

    合作者不需要安装,除非他们想 push/pull。

    当一个 subdir 是一个 subrepo(它有一个.gitrepo文件)时,协作者知道。

    为手动操作生成命名分支和远程控制。

    业主不处理保持子模块同步的复杂性。

    Subrepo 存储库本身可以包含 subrepos。

    不同的分支可以在不同的状态有不同的 subrepos 等。

    你可以 init 将现有的子目录转换为子仓库。

    你的 git 历史保持清晰。

    上游历史记录(clone/pull)被压缩为一次提交。

    你可以看到 subrepo 历史通过 git log subrepo/<subdir>/fetch。

    推回上游的提交不会被压缩。

    试错成本低。

    无需配置。

    不会引入历史来混淆其他 git 命令。

    修复已知的 git-subtree 使用 rebase 会失败的问题。

技巧

  1. 命令表

     git subrepo -h    # Help Overview
    
     git subrepo clone <remote-url> [<subdir>]
     git subrepo init <subdir>
     git subrepo pull <subdir>
     git subrepo push <subdir>  git subrepo fetch <subdir>
     git subrepo branch <subdir>
     git subrepo commit <subdir>
     git subrepo merge-base <branch1> <branch2>  git subrepo status [<subdir>]
     git subrepo clean <subdir>  git subrepo help [<command>]
     git subrepo version

参考

  1. https://github.com/ingydotnet/git-subrepo

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

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

相关文章:
【推荐】 数据库路由中间件MyCat - 源代码篇(4)

git subrepo的更多相关文章

  1. dubbo事件通知机制(1)

    此文已由作者岳猛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. dubbo事件通知机制:http://dubbo.io/books/dubbo-user-book/demos ...

  2. git subtree 使用

    这个是备忘录.原网页(https://medium.com/@porteneuve/mastering-git-subtrees-943d29a798ec , http://cncc.bingj.co ...

  3. git 仓库拆分方案对比

    此文已由作者张磊授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 前言 git 拆分仓库在网上已有的案例上来看,分为 submodule 和 subtree. 还有基于这两个方 ...

  4. Git 子模块 - submodule

    有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另 ...

  5. Git 在团队中的最佳实践--如何正确使用Git Flow

    我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...

  6. Git与Repo入门

    版本控制 版本控制是什么已不用在说了,就是记录我们对文件.目录或工程等的修改历史,方便查看更改历史,备份以便恢复以前的版本,多人协作... 一.原始版本控制 最原始的版本控制是纯手工的版本控制:修改文 ...

  7. Git Bash的一些命令和配置

    查看git版本号: git --version 如果是第一次使用Git,你需要设置署名和邮箱: $ git config --global user.name "用户名" $ gi ...

  8. 在Ubuntu 16.10 安装 git 并上传代码至 git.oschina.net

    1. 注册一个账号和创建项目 先在git.oschina.net上注册一个账号和新建一个project ,如project name 是"myTest". 2.安装git sudo ...

  9. 史上最详细git教程

    题外话 虽然这个标题很惊悚,不过还是把你骗进来了,哈哈-各位看官不要着急,耐心往下看 Git是什么 Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别 SVN是集中式版本控制 ...

随机推荐

  1. nginx实现多个域名共享80端口

    server { listen 80; server_name server8085.duchong.cn; location / { proxy_pass http://127.0.0.1:8085 ...

  2. LightGBM

    1.简介 lightGBM包含两个关键点:light即轻量级,GBM 梯度提升机 LightGBM 是一个梯度 boosting 框架,使用基于学习算法的决策树.它可以说是分布式的,高效的,有以下优势 ...

  3. java 蓝桥杯基础练习 01字串 进制转换

    问题描述 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能.它们的前几个是: 请按从小到大的顺序输出这32种01串. 输入格式 本试题没有输入. 输出格式 输出32行,按从小到大的顺 ...

  4. java算法 第七届 蓝桥杯B组(题+答案) 7.剪邮票

    7.剪邮票  (结果填空) 如[图1.jpg], 有12张连在一起的12生肖的邮票.现在你要从中剪下5张来,要求必须是连着的.(仅仅连接一个角不算相连)比如,[图2.jpg],[图3.jpg]中,粉红 ...

  5. Excel VBA入门(二)数组和字典

    数组和字典也是VBA的常用到数据类型之一.但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典. 事实上,字典不是VBA内置的类型,它是Wind ...

  6. Kafka介绍及集群搭建

    简介 Kafka是一个开源的,分布式的,高吞吐量的消息系统.随着Kafka的版本迭代,日趋成熟.大家对它的使用也逐步从日志系统衍生到其他关键业务领域.特别是其超高吞吐量的特性,在互联网领域,使用越来越 ...

  7. 解决:EXCEL复制粘贴,精度丢失

    公司一部分数据是存在elasticsearch里面的,但里面的ID设计得特别长,我是打算把ID号考出来,用jmeter批量 删除的,但复制粘贴到excel里,ID就会精度丢失. 后来找到一个办法,解决 ...

  8. CocoaPods私有库!!!!!!!!!!!(装逼特技)

    1http://www.jianshu.com/p/4b63dfbd8be7 2  修改工程下的.podspec文件,如 注意1: 验证库是否正确: pod lib lint --verbose -- ...

  9. IDEA04 工具窗口管理、各种跳转、高效定位、行操作、列操作、live template、postfix、alt enter、重构、git使用

    1 工具窗口管理 所有的窗口都是在view -> tools windows 下面的,这些窗口可以放在IDEA的上下左右各个位置:右键某个窗口后选择move to 即可进行位置调整 2 跳转 2 ...

  10. git使用报错: fatal: Couldn't find remote ref master的解决方法

    fatal: Couldn't find remote ref master 翻译过来就是:致命的:无法找到远程参考主,也就是报错的意思.错误的提示内容意思是找不到需要连接的对象. 解决方法有以下几种 ...