需求描述
现有一个非常之庞大(大的过分)的git仓库,包含了N多个项目的源码,项目各个阶段的文档,原型等。对于新用户来说,clone一次需要很长时间(网速也是槽点)。因此决定将原仓库拆分,将源码子目录作为一个新的仓库,并且需要保留和子目录相关的log记录。
一.前期准备
所有的命令在Git-shell中进行
1. 原仓库在本地的目录结构如下图:

1524103977(1).png (10.27 KB, 下载次数: 0)

下载附件  保存到相册

1 小时前 上传

2. 描述约定
为了更好的描述命令,先定义一下命令中占位符的意义
原仓库:<old-repo>
新仓库:<new-repo>
想要分离出来的子文件夹名称: <name-of-folder>
新的远端地址:<new-git-url>
注意:如果你在使用 Windows,且该文件夹深度 > 1,你必须使用斜杠  / 作为目录分隔符而不是默认的反斜杠 \
二.迁移(使用filter-branch命令
由于我需要迁移的子目录包含中文名,因此需要使用filter-branch命令来实现迁移,当然,如果不包含中文的目录也可以使用git1.8版本以后的subtree来实现,该方法稍后说明。
1. 首先,clone 一份原仓库并删掉原来的 remote:(依次执行以下命令)
(1)git clone <big-repo>  <new-repo>
(2)cd <new-repo>
(3)git remote rm origin
2. 然后运行如下命令(这是重点):
(1)git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter <name-of-folder> -- --all
这条命令同样会过滤所有历史提交,只保留所有对指定子目录有影响的提交,并将该子目录设为该仓库的根目录。这里说明各下个参数的作用:
--tag-name-filter 该参数控制我们要如何处理旧的 tag,cat 即表示原样输出;
--prune-empty 删除空的(对子目录没有影响的)提交;
--subdirectory-filter 指定子目录路径;
-- --all 该参数必须跟在  -- 后面,表示对所有分支进行操作。如果你只想保存当前分支,也可以不添加此参数。
3. 清理.git的object
当上述命令执行完毕后,就可以看到本地的新仓库已经是原仓库子目录中的内容了,且保留了关于该子目录所有的提交历史。不过只是这样的话新仓库中的
.git 目录里还是保存有不少无用的 object,我们需要将其清除掉以减小新仓库的体积(如果你用subtree 的方法的话是不需要执行这一步的)。
依次执行以下命令:
(1)git reset --hard
(2)git for-each-ref --format="%(refname)" refs/original/ |xargs -n 1 git update-ref -d
(3)git reflog expire --expire=now --all
(4)git gc --aggressive --prune=now
4. 将新的本地仓库推送到远端
cd到<new-repo>
(1)添加远端地址:
git remote add origin <new-git-url>
(2)推送到远端:
git push -u origin master
特别注意:如果当前远端库是空的话,上述命令是好使的,由于我开始手贱,已经在新的git地址clone到本地,并且还新建了一个测试文件夹,因此导致新的git仓库的master不再是最新的了。因此可以先提交到dev分支:git push origin master:dev
5. 合并dev到master(可选)
如果第4步已经直接推动到master了。第5步可忽略。
(1)首先将本地dev合并到本地master
①切换到master分支
②git merge origan/dev --allow-unrelated-histories
由于是第一次合并,因此需要加上--allow-unrelated-histories,允许两个没有关联的历史合并在一起。后续的合并就不需要了。
(2)将本地master push到远端
(3)
至此,使用filter-branch方式拆分git库已经完成。有木有心动,去试试吧。
三.补充subtree方式迁移
要求拆分的目录没有中文名
1.首先,进入<big-repo> 所在的目录,创建一个<name-of-new-branch>的临时分支,运行:
git subtree split -P <name-of-folder> -b <name-of-new-branch>
2. 然后,我们创建一个新的 git 仓库:
(1)mkdir  <new-repo>
(2)git init
3. 接着把原仓库中的临时分支拉到新仓库中:
git pull </path/to/big-repo>  <name-of-new-branch>
好了,完成。现在看看你的新仓库,是不是已经包含了原子文件夹中的所有文件和你之前在原仓库中的所有提交历史呢?后续步骤就可参照第二章中的3,4,5步了。
虽然网上一搜一大堆,还是希望能帮助有需要的同学,至少可以避免我踩过的坑了。
参考:https://blessing.studio/splitting-a-subfolder-out-into-a-new-git-repository/

git拆分子目录作为新仓库并保留log记录相关推荐

  1. Git提交代码到新仓库(--mirror)

    问题描述 现在我们的项目参与人员超过5人(最大免费人数),但是实际开发人员多余5人,所以需要新建一个仓库,将我拉进去,同时需要我上传代码 但是我此时不想更改原始的origin,想直接通过push到新的 ...

  2. GIT 回滚和push库且保留log

    打开Git Bash命令框通过命令git reset --soft key / git reset –hard key (区别:soft回滚后本地仍会保留修改的记录,hard回滚后不会保留记录会直接回 ...

  3. Git断开与原来远程仓库连接,连接新仓库并重新上传

    查看远程连接 git remote -v 取消与远程库的连接 git remote remove origin 初始化仓库(生成.git文件夹) git init 连接新仓库 git remote a ...

  4. Git迁移新仓库并保存历史提交记录

    第一步,从远程仓库克隆到本地 git clone https://gitee.com/oldxxx/oldxxx.git 第二步,删除需要迁移的本地项目所关联的远程仓库地址 git remote re ...

  5. git 本地重新关联新的远程仓库命令/查看本地关联远程仓库

    git remote -v // 查看本地已经关联的远程仓库 git remote rm name // # 删除远程仓库 git remote rename old_name new_name // ...

  6. Git之深入解析本地仓库的基本操作·仓库的获取更新和提交历史的查看撤销以及标签别名的使用

    一.获取 Git 仓库 通常有两种获取 Git 项目仓库的方式: 将尚未进行版本控制的本地目录转换为 Git 仓库: 从其它服务器克隆一个已存在的 Git 仓库. 两种方式都会在本地机器上得到一个工作 ...

  7. Git 之五 通信协议(HTTPS、SSH、Git)、使用远程仓库(GitHub、GitLab、Gitee等)

    写在前面   Git 的官网上有很详细的使用教程(当然有翻译版本),具体地址是 https://git-scm.com/book/zh/v2.唯一不足就是,很多讲解并没有实机演示.但是,毫无疑问,官网 ...

  8. Git 仓库代码迁移步骤记录

    迁移远程仓库 // 克隆旧仓库镜像 git clone --mirror [oldRepoUrl]// 添加新仓库地址 cd the_repo git remote add [remoteName] ...

  9. Git 之三 常用命令:仓库创建、提交、分支等

    常用命令   虽然 Git 同时提供了 GUI 界面 和 Bash,但是,GUI 界面的功能相对来说还是有点简陋的.要想熟练掌握 Git 的使用,还是需要了解 Git 一系列的命令!   Git 命令 ...

最新文章

  1. 中国光大集团去年营收1617亿元 同比增长19%
  2. 【 FPGA 】UltraFast设计方法学:理解实现策略
  3. Java内存泄露的理解与解决
  4. BZOJ1565:[NOI2009]植物大战僵尸——题解
  5. winform 菜单激发窗体切换做法
  6. Linux 添加环境变量
  7. 如何搞懂容器的核心技术点?
  8. iOS 使用NSUserdefault 保存自定义的 对象
  9. OpenCV+dlib+Python实现人体五官检测
  10. AspNet WebApi OData 学习
  11. intouch的报警怎么发到邮件上
  12. HTML5制作网页版个人简历
  13. HDU 2122 Ice_cream’s world III
  14. JAVA中rpm什么意思,RPM常用命令介绍
  15. python + selenium 自动化测试框架
  16. 单片机 TDA8023 读 ic 卡 smrat card sync_card
  17. java emun ordinal_关于Java:JPA枚举ORDINAL与STRING
  18. 将个人文件夹挂载到服务器上,通过 WebDAV 将服务器全部或某个文件夹挂载到电脑上当网络硬盘 | 很文博客...
  19. 循环的数学应用————21.特殊等式 xyz+yzz =532
  20. 百度人脸活体检测系统通过信通院“护脸计划”首批优秀级安全防护能力评估

热门文章

  1. python如何下载安装glfw_Python之OpenGL笔记(1):窗口工具包GLFW的安装
  2. 如何快速发现网站恶意镜像与网页劫持?
  3. Java 面向对象 之 抽象类 abstract
  4. c语言程序编写字体,c语言程序设计练习题
  5. Consider defining a bean of type ‘com.muses.taoshop.item.service.IItemService‘ in your configuration
  6. 解读:LED照明设备出口沙特需要什么认证?法规要求!
  7. 计算机上点开硬盘有声音,打开计算机电源后,硬盘持续发出哔哔声的原因是什么?原因分析和解决方案介绍...
  8. 【启明云端】启明云端带你揭开WT32-S3-WROVER神秘面纱
  9. 汇编c 易语言编程软件,这些汇编用易语言怎么写?
  10. 使用GWT的第一个程序