程序员最爽的事情是什么?删删删!全部项目原本都很苗条的,时间长了不免有一些越搞越大,怎么看怎么不爽,一个字,拆!今天就说说拆分 Git 仓库这件小事儿。git
这个拆字呢,有两种写法,好比你有一个叫作 big-project
的仓库,目录以下:程序员
big-project ├── codes-a ├── codes-b └── codes-eiyo
有时候想把 codes-eiyo
拆出来作为一个独立仓库;有时候是想把 codes-eiyo
清理掉,只保留剩下的代码在仓库中。如今就来分别看看这两件事情怎么干:github
之前是用 filter-branch 来实现,这个需求太常见了,有人作了个整合的 git-subtree,再后来……subtree
集成进 Git 了。bash
# 这就是那个大仓库 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
:code
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
记得用 count-objects
命令比较新旧仓库的差别(爽爽爽):rem
bash$ git count-objects -vH
接下来要推送给新的远端仓库什么的就随你便了~it
bash$ git remote add origin git://github.com:tom/fresh-project.git $ git push origin -u master