一.需求描述:
现有一个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来实现,该方法稍后说明。

  1. 首先,clone 一份原仓库并删掉原来的 remote:(依次执行以下命令)
    (1)git clone ssh://username@xx.x.xx.xxx:29418/vendor/lenovo
    (2)cd lenovo
    (3)git remote rm origin
  2. 然后运行如下命令(这是重点):
    (1)git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter -- --all
    这条命令同样会过滤所有历史提交,只保留所有对指定子目录有影响的提交,并将该子目录设为该仓库的根目录。这里说明各下个参数的作用:
    --tag-name-filter 该参数控制我们要如何处理旧的 tag,cat 即表示原样输出;
    --prune-empty 删除空的(对子目录没有影响的)提交;
    --subdirectory-filter 指定子目录路径;
    -- --all 该参数必须跟在  -- 后面,表示对所有分支进行操作。如果你只想保存当前分支,也可以不添加此参数。
  3. 清理.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操作耗时比较久,请耐心等待.
  4. 将新的本地仓库推送到远端
    cd到
    (1)添加远端地址:
    git remote add origin
    (2)推送到远端:
    git push -u origin master或者git push --fore origin master

四.补充subtree方式迁移
要求拆分的目录没有中文名
1.首先,进入 所在的目录,创建一个的临时分支,运行:
git subtree split -P -b

  1. 然后,我们创建一个新的 git 仓库:
    (1)mkdir  
    (2)git init
  2. 接着把原仓库中的临时分支拉到新仓库中:
    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记录的更多相关文章

  1. 使用git svn clone迁移svn仓库(保留提交记录)

    使用git svn clone迁移svn仓库 clone命令可以指定很多参数,主要用到这些,你也可以使用git svn help查看完整的参数列表. git svn clone https://172 ...

  2. 合并两个git仓库并保留提交记录

    case如下: 有2个git仓库:repo1.repo2: 想将repo1中的文件移入repo2: repo1的历史日志要保留:   1 2 # 1.将repo1作为远程仓库,添加到repo2中,设置 ...

  3. git 版本库拆分和subtree用法

    git 版本库拆分 原文地址: https://segmentfault.com/a/1190000002548731 程序员最爽的事情是什么?删删删!所有项目本来都很苗条的,时间长了难免有一些越搞越 ...

  4. git 拆库 切库 切分 子目录建库

    如果git库目录是这样的: git根目录 project_a/ project_b/ ... 并且想为project_a单独创建一个代码库 # 拉一个新分支 git co -b project_a_r ...

  5. Git教程--Git安装和版本库的创建

    Git的诞生 很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了. Linus虽然创建了Linux,但Linux的壮大是靠全世界热 ...

  6. 关于git远程版本库的一些问题之解决

    Part1:CentOS6.5免密码登录 修改/etc/ssh/sshd_config RSAAuthentication yesPubkeyAuthentication yesAuthorizedK ...

  7. Git远程版本库

    目前为止,所有的Git操作都是在一个本地版本库中.现在是时候来体验Git分布式的特性了. 说到远程版本库,大家最为熟悉的就是GitHub了,它实际上就相当于一个远程版本库,托管着所有的本地版本库的提交 ...

  8. git学习——git命令之创建版本库和版本退回

    原文来至 一.创建版本库 版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追 ...

  9. Git 初始化版本库

    创建带工作区的版本库 在开始一个新项目时,首先就要创建并初始化代码库.如果是在本机的工作目录中,那么: $ git init 也就够用了.如果想要初始化的版本库不在当前目录,需要为 git init ...

随机推荐

  1. Android Gradle Plugin指南(三)——依赖关系、android库和多项目配置

    原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Librari ...

  2. [TypeScript] Using ES6 and ESNext with TypeScript

    TypeScript is very particular about what is and isn't allowed in a TS file to protect you from commo ...

  3. [Angular] Using directive to create a simple Credit card validator

    We will use 'HostListener' and 'HostBinding' to accomplish the task. The HTML: <label> Credit ...

  4. [React] Normalize Events with Reacts Synthetic Event System

    Event handlers are passed an instance of SyntheticEvent in React. In this video we'll take a look at ...

  5. nopCommerce 3.9 接口笔记

    接口笔记 Nop.Services.Configuration ISettingService : 配置接口(查看) Nop.Services.Localization ILocalizationSe ...

  6. Xcode7 不能使用http网络请求问题解决

    最近使用Xcode 7.0 写代码,发送网路请求提示:  App Transport Security has blocked a cleartext HTTP (http://) resource ...

  7. STL源代码学习--vector用法汇总

    一.容器vector 使用vector你必须包含头文件<vector>: #include<vector> 型别vector是一个定义于namespace std内的templ ...

  8. 【matlab】安装 webcam 支持

    打开 matlab 命令行,输入 webcam,如果提示: 尚未安装 MATLAB Support Package for USB Webcams.打开支持包安装程序即可安装 Webcam Suppo ...

  9. Mac修改文件权限:You don’t have permission to save the file

    1.从互联网上或者其他途径拿过来的工程代码,往往会报下面的提示: (1)打开文件的时候出现窗口提示You don’t have permission to save the file “project ...

  10. zoj 1008 Gnome Tetravex

    开放式存储阵列为每平方米有几个,否则,超时-- #include <stdio.h> #include <string.h> #include <iostream> ...