Git 仓库拆拆拆

Amio

程序员最爽的事情是什么?删删删!所有项目本来都很苗条的,时间长了难免有一些越搞越大,怎么看怎么不爽,一个字,拆!今天就说说拆分 Git 仓库这件小事儿。

这个拆字呢,有两种写法,比如你有一个叫做 big-project 的仓库,目录如下:

big-project
 ├── codes-a
 ├── codes-b
 └── codes-eiyo

有时候想把 codes-eiyo 拆出来做为一个独立仓库;有时候是想把 codes-eiyo 清理掉,只保留剩下的代码在仓库中。现在就来分别看看这两件事情怎么干:

拆分一个子目录为独立仓库

以前是用 filter-branch 来实现,这个需求太常见了,有人做了个整合的 git-subtree,再后来……subtree 集成进 Git 了。

# 这就是那个大仓库 big-project
$ git clone git@github.com:tom/big-project.git
$ cd big-project

# 把所有 `codes-eiyo` 目录下的相关提交整理为一个新的分支 eiyo
$ git subtree split -P codes-eiyo -b eiyo

# 另建一个新目录并初始化为 git 仓库
$ mkdir ../eiyo
$ cd ../eiyo
$ git init

# 拉取旧仓库的 eiyo 分支到当前的 master 分支
$ git pull ../big-project eiyo

清除一个子目录下所有内容和记录

这个还是要用万能的 filter-branch

bash# 还是那个大仓库 big-project
$ git clone git@github.com:tom/big-project.git
$ cd big-project

# 清理 `master` 分支上所有跟 `codes-eiyo` 目录有关的痕迹
$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch codes-eiyo" --prune-empty master

# 另建一个新目录并初始化为 git 仓库
$ mkdir ../big-project-fresh
$ cd ../big-project-fresh
$ git init

# 拉取 `big-project` 的 `master` 分支(到新仓库的 master 分支)
$ git pull ../big-project master

Before & After

记得用 count-objects 命令比较新旧仓库的差异(爽爽爽):

bash$ git count-objects -vH

接下来要推送给新的远端仓库什么的就随你便了~

bash$ git remote add origin git://github.com:tom/fresh-project.git
$ git push origin -u master
阅读 10k

Coding Amio
哎哟……

The way we code the web will determine the way we live online. So we need to bake our values into...

1.3k 声望
60 粉丝
0 条评论
你知道吗?

The way we code the web will determine the way we live online. So we need to bake our values into...

1.3k 声望
60 粉丝
宣传栏