很多时候,我们会遇到在一个git仓库下包含了很多小项目,但是随着有些项目的需求逐渐增大或则市场需求,我们需要将其抽离出来,作为一个单独的项目进行维护并开发。

但是,如果直接拷贝文件粘贴到新建的git repository中,会丢掉原有的commit,所以我们不能这么粗暴地做。

怎么办呢?下面会根据一个例子,详细说明。

假如我们在demos仓库中,包含了如下小项目,其中,我们想将Comet这个目录下的文件单独抽出来,作为一个单独的项目维护开发,如下:

首先,我们通过git clone 将demos导入到本地,然后通过git remote rm origin,切断与远程仓库的关联,如下:

然后,运行git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter <name-of-folder>命令,过滤掉并保留对指定子目录的commit,并将该子目录设为该仓库的根目录:

1. --tag-name-filter:控制我们如何处理旧tag,cat表示原样输出

2. --prune-empty:删除空提交,即对子目录没有影响的

3. --subdirectory-filter:指定子目录路径

运行该命令后,我们可以看见我们的原仓库变为了这样:

虽然从表面上看,我们到达了我们的目的,新仓库已变成了子目录的内容,并且也保留了相关commit,但是新仓库的.git目录并没有被reset,所以我们还需运行如下命令,去为.git瘦身,如下:

好了,到目前为止,子项目提取工作完成。

最后,就是将本地的这个子项目push到远程仓库中了。因为在此之前,我们已经断了原有的远程仓库链接,所以此时我们需要将这个子项目链接到新的远程仓库中。

假设,我们新建一个远程仓库名为testRepo,如下:

按照提示,我们通过git remote add命令,将子项目与该远程仓库链接并push,如下:

这样就完成了我们的目的,下面是远程仓库testRepo结果:

如何将现有 git 仓库中的子项目单独抽出来作为一个独立仓库并保留其提交历史的更多相关文章

  1. 如何将本地git仓库中的代码上传到github

    1,  在github上新建一个仓库,比如为:CSS3Test,仓库地址为:https://github.com/hyuanyuanlisiwei/CSS3Test 2,本地git仓库中的文件项目为C ...

  2. (转)如何将本地git仓库中的代码上传到github

    1,  在github上新建一个仓库,比如为:CSS3Test,仓库地址为:https://github.com/hyuanyuanlisiwei/CSS3Test 2,本地git仓库中的文件项目为C ...

  3. Git .gitignore中已添加文件路径,但仍未被忽略

    当文件之前已经被提交到仓库后,后面即使将文件路径添加到 .gitignore ,使用 git status 命令,依然会看到文件被修改. $ git status 位于分支 master 您的分支与上 ...

  4. 将svn的项目转移到另外一个仓库中

    前几天在做一个项目的时候,因为需要,需要将Server A 上SVN仓库 repos1中的项目pro1迁移到Server B 上的SVN仓库中,首先想到的是:通过复制,但是仔细一想,这样是不可能的:然 ...

  5. 4.Git基础-查看提交历史

    1.查看提交历史 --  git log  使用 git log 可以查看到所有的提交(commit)历史. 1. $ git log 列出所有commit,最新的commit在最上面.会显示每个提交 ...

  6. 创建局域网内远程git仓库,并将本地仓库push推到远程仓库中

    转载请注明出处 http://www.goteny.com/articles/2014/06/136.html http://www.cnblogs.com/zjjne/p/3778640.html ...

  7. 克隆git仓库中的一个分支

    克隆git仓库中的某一个分支,可用如下命令: git clone -b <branch_name> <repo> 如:git clone -b hdcp_ree_tee_dev ...

  8. 把本地git仓库中的项目引入到码云上

    一.安装git软件和TortoiseGit客户端(git需配置环境变量,但安装时已经配置好,无需考虑) 二.生成公钥和私钥(建立与码云的连接) 三.在码云上新建项目(建议在组织的基础上)   四.在码 ...

  9. git忽略文件并删除git仓库中的文件

    问题描述 不慎在创建.gitignore  文件之前的时候将文件push到了 git仓库,即使之后在.gitignore文件中写入新的过滤规则,这些规则也不会起作用的,git依然会对所有git仓库中的 ...

随机推荐

  1. shell--read命令

    read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 1.基本读取read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说).得到输入后,read命令将数 ...

  2. 手动搭建一个webpack+react笔记

    { "name": "lottery", "version": "1.0.0", "description&q ...

  3. 第十二次作业psp

    psp 进度条 代码累积折线图 博文累积折线图 psp饼状图

  4. 《大象Think in UML》阅读笔记之一

    Think in UML这一书以UML为载体,将面向对象的分析设计思想巧妙地融合在建模UML当中,通过一些实例将软件系统的开发过程中的一些知识有机地结合起来.全书共分为四篇:准备篇.基础篇.进阶篇和总 ...

  5. Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型

    条款4:了解如何观察推导出的类型 那些想要知道编译器推导出的类型的人通常分为两种,第一种是实用主义者,他们的动力通常来自于软件产生的问题(例如他们还在调试解决中),他们利用编译器进行寻找,并相信这个能 ...

  6. 6/8 sprint2 看板和燃尽图的更新

  7. pygame学习笔记(2)——从画点到动画

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 1.单个像素(画点)利用pygame画点主要有三种方法:方法一:画长宽为1个像素的正方形 #@小五义 http:/ ...

  8. redis哨兵机制二(转)

    概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如 master宕机了,Redis本身(包括它的很多客户端) ...

  9. Pytest - 进阶功能fixture

    1. 概述 Pytest的fixture功能灵活好用,支持参数设置,便于进行多用例测试,简单便捷,颇有pythonic.如果要深入学习pytest,必学fixture. fixture函数的作用: 完 ...

  10. Support for SSL/TLS protocols on Windows

    https://blogs.msdn.microsoft.com/kaushal/2011/10/02/support-for-ssltls-protocols-on-windows/ Support ...