Git 倉庫拆拆拆

程序員最爽的事情是什麼?刪刪刪!全部項目原本都很苗條的,時間長了不免有一些越搞越大,怎麼看怎麼不爽,一個字,拆!今天就說說拆分 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-branchcode

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 命令比較新舊倉庫的差別(爽爽爽):rem

bash$ git count-objects -vH

接下來要推送給新的遠端倉庫什麼的就隨你便了~it

bash$ git remote add origin git://github.com:tom/fresh-project.git
$ git push origin -u master
相關文章
相關標籤/搜索