程式設計師最爽的事情是什麼?刪刪刪!所有專案本來都很苗條的,時間長了難免有一些越搞越大,怎麼看怎麼不爽,一個字,拆!今天就說說拆分 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