【Git】原Git库拆分子目录作为新仓库,并保留log记录
一.需求描述:
现有一个git仓库,Team A和Team B的人操作同一仓库的不同目录,Team A的dev希望Team B的dev没有权限review属于Team A的代码目录,故现需要先将这个git 库下的子目录进行拆分,为后续单git库权限独有覆盖做准备.
二.操作背景:
Ubuntu shell(终端)
三.迁移(使用filter-branch命令)
由于我需要迁移的子目录包含中文名,因此需要使用filter-branch命令来实现迁移,当然,如果不包含中文的目录也可以使用git1.8版本以后的subtree来实现,该方法稍后说明。
- 首先,clone 一份原仓库并删掉原来的 remote:(依次执行以下命令)
(1)git clone ssh://username@xx.x.xx.xxx:29418/vendor/lenovo
(2)cd lenovo
(3)git remote rm origin - 然后运行如下命令(这是重点):
(1)git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter -- --all
这条命令同样会过滤所有历史提交,只保留所有对指定子目录有影响的提交,并将该子目录设为该仓库的根目录。这里说明各下个参数的作用:
--tag-name-filter 该参数控制我们要如何处理旧的 tag,cat 即表示原样输出;
--prune-empty 删除空的(对子目录没有影响的)提交;
--subdirectory-filter 指定子目录路径;
-- --all 该参数必须跟在 -- 后面,表示对所有分支进行操作。如果你只想保存当前分支,也可以不添加此参数。 - 清理.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
温馨提示:git gc操作耗时比较久,请耐心等待. - 将新的本地仓库推送到远端
cd到
(1)添加远端地址:
git remote add origin
(2)推送到远端:
git push -u origin master或者git push --fore origin master
四.补充subtree方式迁移
要求拆分的目录没有中文名
1.首先,进入 所在的目录,创建一个的临时分支,运行:
git subtree split -P -b
- 然后,我们创建一个新的 git 仓库:
(1)mkdir
(2)git init - 接着把原仓库中的临时分支拉到新仓库中:
git pull
好了,完成。现在看看你的新仓库,是不是已经包含了原子文件夹中的所有文件和你之前在原仓库中的所有提交历史呢?后续步骤就可参照第二章中的3,4,5步了。
参考链接:
https://blog.csdn.net/wang252949/article/details/80003791
https://blessing.studio/splitting-a-subfolder-out-into-a-new-git-repository/
【Git】原Git库拆分子目录作为新仓库,并保留log记录的更多相关文章
- 使用git svn clone迁移svn仓库(保留提交记录)
使用git svn clone迁移svn仓库 clone命令可以指定很多参数,主要用到这些,你也可以使用git svn help查看完整的参数列表. git svn clone https://172 ...
- 合并两个git仓库并保留提交记录
case如下: 有2个git仓库:repo1.repo2: 想将repo1中的文件移入repo2: repo1的历史日志要保留: 1 2 # 1.将repo1作为远程仓库,添加到repo2中,设置 ...
- git 版本库拆分和subtree用法
git 版本库拆分 原文地址: https://segmentfault.com/a/1190000002548731 程序员最爽的事情是什么?删删删!所有项目本来都很苗条的,时间长了难免有一些越搞越 ...
- git 拆库 切库 切分 子目录建库
如果git库目录是这样的: git根目录 project_a/ project_b/ ... 并且想为project_a单独创建一个代码库 # 拉一个新分支 git co -b project_a_r ...
- Git教程--Git安装和版本库的创建
Git的诞生 很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了. Linus虽然创建了Linux,但Linux的壮大是靠全世界热 ...
- 关于git远程版本库的一些问题之解决
Part1:CentOS6.5免密码登录 修改/etc/ssh/sshd_config RSAAuthentication yesPubkeyAuthentication yesAuthorizedK ...
- Git远程版本库
目前为止,所有的Git操作都是在一个本地版本库中.现在是时候来体验Git分布式的特性了. 说到远程版本库,大家最为熟悉的就是GitHub了,它实际上就相当于一个远程版本库,托管着所有的本地版本库的提交 ...
- git学习——git命令之创建版本库和版本退回
原文来至 一.创建版本库 版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追 ...
- Git 初始化版本库
创建带工作区的版本库 在开始一个新项目时,首先就要创建并初始化代码库.如果是在本机的工作目录中,那么: $ git init 也就够用了.如果想要初始化的版本库不在当前目录,需要为 git init ...
随机推荐
- 判断文件是否存在的另一种方法 _access 和 _waccess
函数原型: int _access( const char *path, int mode ); int _waccess( const wchar_t *path, int mode ); 示例代码 ...
- 使用搜狐Sendcloud的Webapi发送邮件:Jodd和Apache Httpclient
最近,在使用搜狐Sendcloud发邮件. Sendcloud提供http格式的webapi,方便地发送邮件,当然是要付费的. 很早之前,http工具一直用Httpclient,后来觉得jodd ...
- 【t030】数字构造
Time Limit: 3 second Memory Limit: 256 MB [问题描述] 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行 ...
- [Angular] Reactive Form -- FormControl & formControlName, FormGroup, formGroup & formGroupName
First time dealing with Reactive form might be a little bit hard to understand. I have used Angular- ...
- NSArray NSMutableArray 初始化
NSArray* Array;//此时数组没有初始化,数组=nil [Array objectAtIndex:2];//不会调用其属性方法,这里不会崩溃 NSMutableArray *Mutable ...
- 学习JS的这些日子——十二月总结
事实上非常想早就发表这篇十二月份的总结了,可是一直拖拖拉拉没有完毕.一直在想2015年都过去了,该不该再去 写这一篇2015年最后一个月的总结.还有就是2015年的年终总结能否够取代十二月的总结,后来 ...
- js进阶 9-10 html中如何遍历下拉列表
js进阶 9-10 html中单选框和多选框如何遍历下拉列表 一.总结 一句话总结: 1.select元素的options.length可以获取选择长度,然后用options[i]精确定位到选项,用 ...
- tip of Firefox extention foxyproxy
tip of Firefox extention foxyproxy
- NOIP模拟 table - 矩阵链表
题目大意: 给一个n*m的矩阵,每次交换两个大小相同的不重叠的子矩阵,输出最后的矩阵 题目分析: 这题向我们展示了出神入化的链表是如何炼成的.思想都懂,实现是真的需要技术,%%% 用一副链表来表示该矩 ...
- python io操作
一次性读取 # 读取文件 # 默认打开文件的方式是只读 file = None try: file = open("f:/test.sql") print(file.name) # ...