如果想要把現有倉庫中的某個目錄拆出來成為一個獨立的倉庫,概念上 是進行「重新做所有的 commit,但這次只做跟目錄有關的部份」。像這類的概念,都可以 利用 filter-branch 這個指令來完成。

假設在 foo.git 中有個 bar/ 目錄要獨立,這部份是進行以下步驟:

git clone foo.git bar
cd bar/
git filter-branch --subdirectory-filter bar -- --all

這樣做完就行了。新建的 bar 目錄就會只有原 foo/bar 的檔案及歷史。

foo/bar 如果要移除,簡單的方式是 git rm bar,但這樣歷史記錄還是在。如果 有需要篡改歷史,概念上則是「重新做所有的 commit,但這次略過跟 bar 目錄有關的部份」。 一樣也是用 filter-branch 指令。

git clone foo.git
cd foo/
git filter-branch --tree-filter 'rm -rf bar/' -- --all
git push --force

最後的 git push 一定需要 --force,因為歷史被改變的關係。這表示其他人最好重新 做 git clone