• git 版本库拆分和subtree用法


    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
  • 相关阅读:
    Windows下Yarn安装与使用
    Node.js安装及环境配置之Windows篇
    sharding-jdbc—分片策略:Inline行表达式分片策略InlineShardingStrategy(2)
    sharding-jdbc—分片策略:标准分片策略StandardShardingStrategy(1)
    sharding-jdbc—分片策略(总)
    ShardingJdbc 数据脱敏
    ShardingJdbc 数据分布式事务
    Spring Boot整合Sharding-JDBC实现分库分表+读写分离org.apache.shardingsphere+mybatis-plus(4)
    jenkins docker
    nps 使用
  • 原文地址:https://www.cnblogs.com/silentdoer/p/9021322.html
Copyright © 2020-2023  润新知