美文网首页
git拆分代码仓库

git拆分代码仓库

作者: 雷布斯基 | 来源:发表于2019-05-31 10:46 被阅读0次

背景

随着业务的增长,git仓库越来越臃肿,趁着本次升级 Node.js 版本的机会,准备对部分业务代码仓库进行拆分。

其实之前为了业务合规,做过一次拆分,当时就是拷贝代码,删掉了不相关的文件和文件夹,push到远端新仓库。但是所有的文件修改都变成了我的,没有历史commit,不方便从代码修改历史中,找到相关负责人。

所以本次升级的一个很重要的目标是,保留历史提交信息。

操作

网上一查,其实拆分git仓库的代码很多,流程基本都是:

  • 从 master 上,使用 git subtree 将某个文件夹抽出来
cd big-repo
git subtree split --prefix dir-to-extract -b selective-history
  • 新建一个仓库,从上述分支中拉取代码
mkdir slim-repo
cd slim-repo
git init
git pull ../big-repo selective-history:master
  • 之后再提交代码就行了
cd big-repo
git subtree split --prefix dir-to-extract -b selective-history
git push git@github.com:cjohansen/my-new-slim-repo.git selective-history:master

这就完成了一个文件夹的抽取,就是这么简单。

但是如果想要抽取多个文件夹改怎么办呢?

这种情况就不能使用 git subtree 了,得使用 git filter-branch

git clone git@github.com:cjohansen/some-fat-repo.git
cd some-fat-repo
git filter-branch \
    --tree-filter 'find . ! \( -path "./terraform*" -o \
                               -path "./packer*" -o \
                               -path "./.git*" -o \
                               -path "." \) \
                        -exec rm -fr {} +' \
    --prune-empty \
    HEAD

这样可以遍历所有的commit,删掉我们不想要的文件。使用 --prune-empty 参数可以将空分支给删掉。

但是还是遇到了问题,执行了10分钟之后,报 find: './api-doc/xxxx': No such file or directory 的错。查了一下,加上 -prune 参数即可解决该问题。

git filter-branch \
    --tree-filter 'find . ! \( -path "./terraform*" -o \
                               -path "./packer*" -o \
                               -path "./.git*" -o \
                               -path "." \) \
                        -prune -exec rm -fr {} +' \
    --prune-empty \
    HEAD

参考

Git Subtree for Multiple Directories
Git 仓库拆拆拆
Delete files and directories by their names. No such file or directory

相关文章

  • git拆分代码仓库

    背景 随着业务的增长,git仓库越来越臃肿,趁着本次升级 Node.js 版本的机会,准备对部分业务代码仓库进行拆...

  • Git 代码管理和常用命令

    git 其实有3个代码仓库:workspace的代码、本地仓库的代码、远程仓库的代码 git commit,指的是...

  • git常用指令

    下载远程仓库代码 git clone 代码仓库地址 从远程仓库拉取代码 git pull 提交代码到本地分支,并推...

  • 通过Git将本地项目和远程仓库做关联

    添加远程代码仓库: git remote add origin 远程仓库地址 提交代码到远程仓库: git pus...

  • Git学习日记

    创建代码仓库 通过git init指令,可以将一个目录设置生Git代码仓库,代码如下: 输入git init命令:...

  • Git的操作流程

    Git的基本操作: 只要操作git 最前⾯面 都需要写git 克隆隆远程代码仓库:git clone+远程代码仓库...

  • 日常用的git提交代码的方法

    日常用的git提交代码的方法 一、初始化本地仓库,提交代码,提交到远程git仓库 1、初始化代码仓库 git in...

  • Gite Bash 用法2018-07-16

    Git的基本操作: 只要操作git 最前面 都需要写git 克隆隆远程代码仓库:git clone 远程代码仓库的...

  • git 命令行操作笔记

    git中的选项解释 创建本地git仓库 提交代码到git仓库 本地git仓库添加到远程仓库中 克隆远程仓库到本地 ...

  • Git命令

    git push 作用:将本地仓库中代码提交到远程仓库 语法 :git push 仓库地址 master git ...

网友评论

      本文标题:git拆分代码仓库

      本文链接:https://www.haomeiwen.com/subject/tbqwtctx.html