如何将现有 git 仓库中的子项目单独抽出来作为一个独立仓库并保留其提交历史
很多时候,我们会遇到在一个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 仓库中的子项目单独抽出来作为一个独立仓库并保留其提交历史的更多相关文章
- 如何将本地git仓库中的代码上传到github
1, 在github上新建一个仓库,比如为:CSS3Test,仓库地址为:https://github.com/hyuanyuanlisiwei/CSS3Test 2,本地git仓库中的文件项目为C ...
- (转)如何将本地git仓库中的代码上传到github
1, 在github上新建一个仓库,比如为:CSS3Test,仓库地址为:https://github.com/hyuanyuanlisiwei/CSS3Test 2,本地git仓库中的文件项目为C ...
- Git .gitignore中已添加文件路径,但仍未被忽略
当文件之前已经被提交到仓库后,后面即使将文件路径添加到 .gitignore ,使用 git status 命令,依然会看到文件被修改. $ git status 位于分支 master 您的分支与上 ...
- 将svn的项目转移到另外一个仓库中
前几天在做一个项目的时候,因为需要,需要将Server A 上SVN仓库 repos1中的项目pro1迁移到Server B 上的SVN仓库中,首先想到的是:通过复制,但是仔细一想,这样是不可能的:然 ...
- 4.Git基础-查看提交历史
1.查看提交历史 -- git log 使用 git log 可以查看到所有的提交(commit)历史. 1. $ git log 列出所有commit,最新的commit在最上面.会显示每个提交 ...
- 创建局域网内远程git仓库,并将本地仓库push推到远程仓库中
转载请注明出处 http://www.goteny.com/articles/2014/06/136.html http://www.cnblogs.com/zjjne/p/3778640.html ...
- 克隆git仓库中的一个分支
克隆git仓库中的某一个分支,可用如下命令: git clone -b <branch_name> <repo> 如:git clone -b hdcp_ree_tee_dev ...
- 把本地git仓库中的项目引入到码云上
一.安装git软件和TortoiseGit客户端(git需配置环境变量,但安装时已经配置好,无需考虑) 二.生成公钥和私钥(建立与码云的连接) 三.在码云上新建项目(建议在组织的基础上) 四.在码 ...
- git忽略文件并删除git仓库中的文件
问题描述 不慎在创建.gitignore 文件之前的时候将文件push到了 git仓库,即使之后在.gitignore文件中写入新的过滤规则,这些规则也不会起作用的,git依然会对所有git仓库中的 ...
随机推荐
- JAVA之异常处理(一)
JAVA之异常处理(一) 1.异常概述 在程序的开发过程中,可能存在各种各样的错误,有些错误是可以避免的,而有些错误却是意想不到的,在Java中把这些可能发生的错误称为异常.异常类的继承关系如下图. ...
- Zabbix对接AD域
需要的信息:一个域账号密码,使用的端口:域名 1.先查看php是否安装了ldap模块 php –m (查看已安装的php模块) 若没有安装请参照“在已编译安装的PHP环境下安装LDAP模块”. ...
- AI入门课程资源
企业 kaggle https://www.kaggle.com/learn/overview Google 介绍 https://developers.google.cn/machine-lea ...
- 使用git-premit时的问题
package.json 相关配置如下 { "scripts": { "lint": "eslint pages/* component/* --fi ...
- Java 的 java_home, path, classpath
java_home: 指定 jdk 的安装目录. 第三方软件 Eclipse / Tomcat 在 java_home 指定的目录下查找安装好的 jdk. path: 配置 jdk 的安装目录.在命令 ...
- 20135234mqy 实验二 Java面向对象程序设计
北京电子科技学院(BESTI) 实 验 报 告 课程:Java程序设计 班级:1352 姓名:mqy 学号:20135234 成绩: 指导教师: ...
- java_web连接SQL_server详细步骤
(1).我用的是Myeclipse,可以直接将sqljdbc4.jar拷到项目文件 (2).点开SQL Server配置管理器 选中SQL Server2008网络配置下的SQLEXPRESS的协议, ...
- Java script 中的面向对象1
Java script 中的面向对象 对象 对象是Javascript的基本数据类型,对象是一种复合值,将很多的键值对聚合在一起使用.对象可看做是属性的无序集合,每个属性都是一个名/值对.属性名其实是 ...
- tomcat启动问题排查
遇到tomcat错误时不一定是tomcat的配置问题,还有可能是项目的配置问题.检查下xml的servlet配置是不是出了问题. tomcat8.0使用注解的方式帮我注册了servlet了,这时候已经 ...
- 团队作业4——第一次项目冲刺(Alpha版本)2017.11.14
1.当天站立式会议照片 本次会议在5号公寓1楼召开,本次会议内容:①:熟悉每个人想做的模块.②:根据老师的要求将项目划分成一系列小任务.③:选择项目的开发模式:jsp+servlet+javabean ...