不少时候,咱们会遇到在一个git仓库下包含了不少小项目,可是随着有些项目的需求逐渐增大或则市场需求,咱们须要将其抽离出来,做为一个单独的项目进行维护并开发。git
可是,若是直接拷贝文件粘贴到新建的git repository中,会丢掉原有的commit,因此咱们不能这么粗暴地作。blog
怎么办呢?下面会根据一个例子,详细说明。开发
假如咱们在demos仓库中,包含了以下小项目,其中,咱们想将Comet这个目录下的文件单独抽出来,做为一个单独的项目维护开发,以下:rem
首先,咱们经过git clone 将demos导入到本地,而后经过git remote rm origin,切断与远程仓库的关联,以下:it
而后,运行git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter <name-of-folder>命令,过滤掉并保留对指定子目录的commit,并将该子目录设为该仓库的根目录:test
1. --tag-name-filter:控制咱们如何处理旧tag,cat表示原样输出im
2. --prune-empty:删除空提交,即对子目录没有影响的demo
3. --subdirectory-filter:指定子目录路径项目
运行该命令后,咱们能够看见咱们的原仓库变为了这样:filter
虽然从表面上看,咱们到达了咱们的目的,新仓库已变成了子目录的内容,而且也保留了相关commit,可是新仓库的.git目录并无被reset,因此咱们还需运行以下命令,去为.git瘦身,以下:
好了,到目前为止,子项目提取工做完成。
最后,就是将本地的这个子项目push到远程仓库中了。由于在此以前,咱们已经断了原有的远程仓库连接,因此此时咱们须要将这个子项目连接到新的远程仓库中。
假设,咱们新建一个远程仓库名为testRepo,以下:
按照提示,咱们经过git remote add命令,将子项目与该远程仓库连接并push,以下:
这样就完成了咱们的目的,下面是远程仓库testRepo结果: