如何把GIT仓库的子目录独立成新仓库
来源:互联网 发布:相马光子 知乎 编辑:程序博客网 时间:2024/05/01 06:28
如何把GIT仓库的子目录独立成新仓库
我有一个名为MyLisp的仓库,里面存放的是一些我自己写的elisp脚本,仓库地址是~/MyLisp.
其中我使用elisp模仿rake写了一个新的构建工具名为elake,存放在~/MyLisp/elake目录中. 某一天我想把elake独立出来作为一个仓库来使用,则有两种方法可以实现:
使用git filter-branch
clone一个新的MyLisp仓库到~/elake
git clone ~/MyLisp ~/elake
通常刚clone出来的~/elake仓库本地只会有一个master分支,如果我们希望保存其他的分支,那就首先把它们创建出来:
cd ~/elakegit branch -r br1 origin/br1git branch -r br2 origin/br2
删掉无用的origin
git remote rm origin
过滤所有历史提交,只保留对elake子目录有影响的提交,并且把子目录设为该仓库的根目录
git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter elake -- --all
其中各参数的意义如下:
- –tag-name-filter cat : 该参数控制我们要如何保存旧的tag,参数值为bash命令,cat表示原样输出。所以,如果你不关心tag,就不需要这个参数了;
- –prune-empty: 删除空的(对子目录没有影响的)的提交
- –subdirectory-filter elake: 指定子模块路径
- –all: 该参数必须跟在–后面,表示对所有分支做操作,即对上一步创建的所有本地分支做操作。所以,如果你只想保存当前分支,就不需要这个参数了
该命令执行完毕后,查看当前目录结构就会发现里面已经是子目录的内容了。git log查看提交历史已经正常保存了
至此,主要工作已经完成。但是当前的仓库中还保存这一下不需要的object,如果想清理这些来减小当前仓库的体积
git reset --hardgit for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -dgit reflog expire --expire=now --allgit gc --aggressive --prune=now
使用git tree
git 1.7.11之后使用 git subtree 指令可以很簡單地把單一資料夾相關的 commit 都抽出來
将MyLisp仓库中关于elake的提交信息抽出为新的branch
cd ~/MyLispgit subtree split -P elake -b elake
新建elake仓库,并从MyLisp的elake branch中拉内容
cd ~/mkdir elakegit initgit pull ~/MyLisp elake
0 0
- 如何把GIT仓库的子目录独立成新仓库
- 如何把GIT仓库的子目录独立为子模块
- 如何把本地项目添加到新的git远程仓库
- git把本地仓库推送到新仓库
- git push 新的远程仓库
- 初始化一个新的Git仓库
- git切换新的仓库地址
- Git 关联新的远程仓库
- 如何删除本地的git仓库 和 github的仓库
- 在git添加远程库的过程中,写错远程仓库地址,如何把远程仓库地址修改回来
- 在git添加远程库的过程中,写错远程仓库地址,如何把远程仓库地址修改回来
- Git如何把本地代码推送到远程仓库
- 如何快速的搜索git仓库
- git 如何删除本地创建的仓库
- git 如何删除本地创建的仓库
- git 仓库地址切换本地代码切换到新的git 仓库上
- git仓库的组成
- Git的远程仓库
- 《大话数据结构》第9章 排序 9.4 简单选择排序
- Matlab---变量
- XCode调试技巧–设置全局断点快速定位问题代码所在行
- Android 内存分析工具LogCat GC
- 图文详解YUV数据格式
- 如何把GIT仓库的子目录独立成新仓库
- 程序员如何保持健康
- 不用中间变量交换两个数的值
- NYOJ
- 《大话数据结构》第9章 排序 9.5 直接插入排序
- 人生的第一个Android游戏诞生
- PCB设计的可测试性概念
- I.mx6s上移植wm8960驱动(基于linux3.0.101版本)
- Edit Distance