git 版本库拆分

原文地址: https://segmentfault.com/a/1190000002548731

程序员最爽的事情是什么?删删删!所有项目本来都很苗条的,时间长了难免有一些越搞越大,怎么看怎么不爽,一个字,拆!今天就说说拆分 Git 仓库这件小事儿。

这个拆字呢,有两种写法,比如你有一个叫做 big-project 的仓库,目录如下:

big-project 
├── codes-a 
├── codes-b 
└── codes-eiyo 
有时候想把 codes-eiyo 拆出来做为一个独立仓库;有时候是想把 codes-eiyo 清理掉,只保留剩下的代码在仓库中。现在就来分别看看这两件事情怎么干:

拆分一个子目录为独立仓库 
以前是用 filter-branch 来实现,这个需求太常见了,有人做了个整合的 git-subtree,再后来……subtree 集成进 Git 了。

这就是那个大仓库 big-project

$ git clone git@github.com:tom/big-project.git
$ cd big-project

把所有 codes-eiyo 目录下的相关提交整理为一个新的分支 eiyo

$ git subtree split -P codes-eiyo -b eiyo(-P是Prefix的意思,如果需要查看哪些options可以git subtree split --help)

另建一个新目录并初始化为 git 仓库

$ mkdir ../eiyo
$ cd ../eiyo
$ git init

拉取旧仓库的 eiyo 分支到当前的 master 分支

$ git pull ../big-project eiyo

清除一个子目录下所有内容和记录 
这个还是要用万能的 filter-branch:

还是那个大仓库 big-project

$ git clone git@github.com:tom/big-project.git
$ cd big-project

清理 master 分支上所有跟 codes-eiyo 目录有关的痕迹

$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch codes-eiyo" --prune-empty master

另建一个新目录并初始化为 git 仓库

$ mkdir ../big-project-fresh
$ cd ../big-project-fresh
$ git init

拉取 big-project 的 master 分支(到新仓库的 master 分支)

$ git pull ../big-project master
Before & After

记得用 count-objects 命令比较新旧仓库的差异(爽爽爽):

$ git count-objects -vH

接下来要推送给新的远端仓库什么的就随你便了~

$ git remote add origin git://github.com:tom/fresh-project.git
$ git push origin -u master

git subtree用法

使用场景

例如,在项目Game中有一个子目录AI。Game和AI分别是一个独立的git项目,可以分开维护。为了避免直接复制粘贴代码,我们希望Game中的AI子目录与AI的git项目关联,有3层意思:

AI子目录使用AI的git项目来填充,内容保持一致。 
当AI的git项目代码有更新,可以拉取更新到Game项目的AI子目录来。 
反过来,当Game项目的AI子目录有变更,还可以推送这些变更到AI的git项目。 
用git subtree可以轻松满足上面的需求。

git subtree用法

针对第一段的3条需求,我分别说明具体的命令。

1. 第一次添加子目录,建立与git项目的关联

建立关联总共有2条命令。

语法:git remote add -f <子仓库名> <子仓库地址>

解释:其中-f意思是在添加远程仓库之后,立即执行fetch。

语法:git subtree add –prefix=<子目录名> <子仓库名> <分支> –squash

解释:–squash意思是把subtree的改动合并成一次commit,这样就不用拉取子项目完整的历史记录。–prefix之后的=等号也可以用空格。

示例

$git remote add -f ai https://github.com/aoxu/ai.git
$git subtree add --prefix=ai ai master --squash

2. 从远程仓库更新子目录

更新子目录有2条命令。

语法:git fetch <远程仓库名> <分支>

语法:git subtree pull –prefix=<子目录名> <远程分支> <分支> –squash

示例

$git fetch ai master
$git subtree pull --prefix=ai ai --squash

3. 从子目录push到远程仓库(确认你有写权限)

推送子目录的变更有1条命令。

语法:git subtree push –prefix=<子目录名> <远程分支名> 分支

示例

$git subtree push --prefix=ai ai master

git 版本库拆分和subtree用法的更多相关文章

  1. git 版本库回滚(转载)

    From:http://www.cnblogs.com/qualitysong/archive/2012/11/27/2791486.html From: http://www.tech126.com ...

  2. 萌新笔记——git的问题(error: object file .git/objects/* is empty...)的解决方案及对git版本库文件的了解

    由于操作不当,导致git版本库出了大问题,如下所示: error: object file .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e ...

  3. redmine整合GIT版本库

    redmine整合GIT版本库   服务器的环境: Ubuntu 11.10 64位 Redmine 1.4.5.stable.10943 git version 1.7.5.4 + gitolite ...

  4. GIT版本库回滚【图文版】

    git 版本库回滚,在实际开发过程中总会遇得到   1. 先找出需要回滚的commitid     git log -3   2. 重置本地版本库到指定commitid, 注意:本地改动将丢失     ...

  5. Git版本库

    创建版本库:git init db 只要用git init db 就可以很容易创建一个空的Git版本库. Git版本库创建好之后,在版本库的目录下有一个.git的子目录中有几项内容,其中注意三项: 1 ...

  6. hg(Mercurial)版本库迁移到git版本库

    这几天没事干净搞迁移了,迁移完MVC又迁移版本库,还把工作电脑迁移了一下,开始用Win8.1了.这个迁移主要是因为实在不想在工作电脑上又装git又装hg了,点个右键出来一大堆菜单,况且现在git已经成 ...

  7. Git版本库创建(包含文件权限设置 Linux环境下)

    确保git服务已安装成功,如果没有安装git服务查看:Git源码安装 Linux指定安装目录 1.创建git用户,并设置密码.并禁止git用户通过shell登录服务器(注意如果需要安装gitolite ...

  8. Git版本库的创建(Ubuntu)

    在Ubuntu上学习Git随笔. 一. git 仓库的安装 git 在终端用git命令查看Ubuntu是否安装git版本库,如果没有安装,最新版本(Ubuntu18.04)会提示用下面命令进行安装. ...

  9. git的问题(error: object file .git/objects/* is empty...)的解决方案及对git版本库文件的了解

    由于操作不当,导致git版本库出了大问题,如下所示: error: object file .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e ...

随机推荐

  1. HTML基础学习笔记(1)

    HTML学习笔记(1) 1.常用快捷键 win+d---返回桌面 win+e---我的电脑 win+r---打开运行 Alt+tab---切换软件 ctrl+tab---切换软件文档 F2---重命名 ...

  2. springmvc入门(1)

    一..springmvc框架 1.什么是springmvc springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合.springmvc是一个基于mv ...

  3. activity背景毛玻璃效果

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...

  4. Django中反向生成models

    我们在展示django ORM反向生成之前,我们先说一下怎么样正向生成代码. 正向生成,指的是先创建model.py文件,然后通过django内置的编译器,在数据库如mysql中创建出符合model. ...

  5. go语言使用go-sciter创建桌面应用(三) 事件处理,函数与方法定义,go与tiscript之间相互调用

    sciter处理脚本tiscript,用于处理UI交互中的一些逻辑,跟js很像,但又有点区别,对前端熟悉的人应该能很快上手. tiscrip脚本文档 https://sciter.com/develo ...

  6. django分页的东西, 不详细, 但是也足够了。

    视图函数中的代码 from django.shortcuts import render, HttpResponse, redirect import json from django.core.pa ...

  7. Attribute Syntax

    Attribute Syntax This section describes the syntax with which __attribute__ may be used, and the con ...

  8. iOS设置图片名称、启动图片、防止TabBar图片和文字渲染

    设置App的名称 设置App的启动图片 需要注意点是,App要杀掉重启才能显示出启动图片 2种方法防止图片被渲染 1. vc02.tabBarItem.image = [UIImage imageNa ...

  9. Luogu2149 [SDOI2009]Elaxia的路线-最短路+拓扑排序

    Solution 另外$ m <=5e5$. 两条最短路的 最长公共路径 一定是若干条连续的边, 并且满足拓扑序. 于是我们分别 正向 和反向走第二条路径,若该条边同时是两条最短路径上的边, 则 ...

  10. Python之路番外(第三篇):Pycharm的使用秘籍

    版本:Pycharm2017.3.4Professional Edition 一.Pycharm的基本使用1.在Pycharm下为你的python项目配置python解释器 file --settin ...