Categories
通風報信

使用 git subtree 來分拆子目錄成獨立的新 repo

以往要達到分拆子目錄成新的 repo ,就像這個問題在 Stack Overflow 上原本的解答那樣,得用上 git filter-branch 跟一堆繁複的流程才能達成,不過後來有人寫了 git-subtree來專門處理這件事,由於這個功能似乎太常被用到,所以在 git 1.7.11 以後就有內建這個模組了(但是不一定有裝上去),現在使用 git subtree 指令可以很簡單地把單一資料夾相關的 commit 都抽出來。

以下是我從 central 這個 repo 中把 wiki 獨立出來的過程:

cd central
git subtree split -P wiki -b mediawiki (這會把 wiki 這個資料夾抽出來成為一個叫 mediawiki 的 branch)
cd ..
mkdir wiki.moztw.org
cd wiki.moztw.org
git init
git pull ../central mediawiki (從 central 中把 mediawiki 這個 branch 的資料拉回來)
git remote add origin https://github.com/moztw/wiki.moztw.org.git
git push origin -u master

如果還要徹底清理掉原本 central 裡 wiki 的資料:

git filter-branch -f --index-filter "git rm -r -f -q --cached --ignore-unmatch wiki" --prune-empty HEAD

雖然可以節省 repo 佔用的空間,但是這會 rewrite commits history,請斟酌使用。

值得一提的是,git subtree 原本是為了提供 git submodule 以外的另一種方便管理子專案的選擇,因此也有相關的用法可以嘗試看看。

至於把 repo 合併回來成一個子目錄嘛,雖然也做得到,不過與其真要這樣做好像還是用 git subtree 來管理會更好用一些。

另外關於 git filter-branch 的更多用法可以參看這篇文章

3 replies on “使用 git subtree 來分拆子目錄成獨立的新 repo”