以往要達到分拆子目錄成新的 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 的更多用法可以參看這篇文章。
過往今昔…
- 柴門文的東京愛情故事 - 2011
“使用 git subtree 來分拆子目錄成獨立的新 repo” 有 3 則迴響
迴響已被關閉。