半栈工程师

《Git/Gitlab进阶》十六:将单一项目拆成多个小项目并保留

2020-03-01  本文已影响0人  紫狐挽诗

本章主要测试讲解

本篇内容,不建议跳过,如果有这个需求,还请仔细详细查看,谢谢。

测试过程

前置说明

与项目合并相反,这是需要把单一项目的.git 的提交记录,抽取出各自子项目想要的部分。不过,相对于合并,拆分要简单些。

就不考虑把一个单独的文件拆成一个项目了。如果实在需要,就把这个单个文件,也放到一个文件夹中,再拆这个文件夹即可。

本地 git 仓库使用的是相对路径,所以直接修改 root folder 不会影响 git 历史记录

项目准备

不将上一篇合并好的 timetools 再拆开。直接使用之前从 github 上克隆的 dayjs 项目作业。

在作业前,dayjs 的结构是这样的:

1.png

查看一下,此时所有的日志 log 修改的文件名。如下图(这里是可以看到所有文件修改内容和提交数量):

2.png

dayjs 项目中,dayjs/src/有两个文件夹,locale/和 plugin/,示例假装 locale/需要拆出来,做一个单独的项目。

大概流程

使用git filter-branch实现–不推荐,仅作了解,不感兴趣可略过

重写提交历史记录

$ git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter src/locale -- --all

命令说明:

git filter-branch通过重写分支来重写 Git 修订历史记录,并在每个修订版上应用自定义过滤器。

此操作会花点时间,执行完成,可以看到,原版的 dayjs 下的文件,变成了这样:

执行后

清除.git 的 object 文件夹(如果觉得有必要的话)

git reset --hard
git for-each-ref --format="%(refname)" refs/original/ |xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --aggressive --prune=now

git for-each-ref 根据给定的集合对它们进行排序之后,迭代所有匹配的 ref <pattern>并根据给定的显示它们。

git-update-ref-安全地更新存储在 ref 中的对象名称

git reflog expire 修剪较旧的引用日志条目。

git-gc 清理不必要的文件并优化本地存储库

清除的执行如下图:

清除object

查看日志信息

其实最重要就只有第一步而已,完成之后,现在可以查看到现在的 dayjs 的日志
如下图:

执行后的日志

现在只有原来在 dayjs/src/locale 里面的文件被修改的提交记录被保留,其它的都丢掉了。

只要把这个现在的 dayjs 修改成 locale,就完成了大项目拆分成子项目的操作。

使用git subtree实现–推荐做法

同样,使用最开始的从 github 中拉下来的 dayjs 做源项目。

进入 dayjs,创建一个临时分支

git subtree split -P src/locale -b my-locale

命令说明:

git subtree 合并子树并将存储库拆分为子树。
这个命令不在原本的 git 参考文件上,不过用法比较简单,可以在这里查看的更多用法。

如下图

创建临时分支

创建一个新的 git 空项目

在与 dayjs 平级的路径下,创建一个文件夹,例如 my-locale(和上一步创建的分支名没任何关系),并进入,然后 git 初始化

cd ..
mkdir my-locale
cd my-locale
git init

如下图:

新建空git项目

将原仓库的临时分支 my-locale 拉到新仓库

git pull ../dayjs my-locale

如下图

空项目完成临时分支的拉取

查看日志,效果一致,如下图:

一样的日志

对于一开始说的,单个文件,想要这样做,似乎不行。如下图。

单个文件拆成项目

还是放到文件夹吧。

总结

        cd <source-project>
        git subtree split -P <prefix>  -b <temp-branch>
        cd ..
        mkdir <sub-project>
        cd <sub-project>
        git init
        git pull <source-project path> <temp-branch>
上一篇 下一篇

猜你喜欢

热点阅读