在 Heresy 來看,Git 和 SVN 相比,雖然因為他的分散式設計,有相當多的好處,不過,還是有一些地方,是比較不方便的。其中一個,就是在複製 repository 的時候,必須要把整個一起複製下來、而不能只複製其中一部分。
也因為這個問題,所以如果再 SVN 是把多個專案放在同一個 repository 裡使用的話,再轉換到 Git 後,會產生「明明只是要其中一個專案,卻需要把所有專案都複製下來」的問題。
而要解決的方法,基本上就是要把 repository 底下的不同專案、各自切割出來了~Heresy 這邊主要是參考《git 倉庫分家》這篇文章的做法。
獨立單一資料夾
如果要讓整個 Git 的 repository 裡面,只剩下其中一個資料夾的內容的話,基本上就是在 repository 的根目錄下,執行下面這段 Git 的指令:
git filter-branch --subdirectory-filter DIR -- --all
其中,DIR 就是要保留的資料夾。在執行過這段指令後,DIR 底下所有的檔案都會被搬出來、放到 repository 的根目錄下,而其他的檔案都會被刪除。
刪除單一資料夾
而如果是要刪除 Git repository 裡的某個資料夾,基本上本來內建的功能就做得到了,以 TortoiseGit 來說,只要選取資料夾後、按右鍵就可以找到「delete」的功能了。但是這樣傳統的做法,以前這個資料夾相關的更新紀錄,也都還會留下來,如果是希望徹底分家的話,其實這樣切得不是很乾淨。
所以如果希望連帶更新紀錄都憶起刪除的話,基本上則是要透過 Git 的指令來重做 Git repository 裡的所有 commit、並略過指定資料夾相關的部分。也因為他需要重新處理全部的 commit,所以時間也會花相當久…要這樣做的指令是:
git filter-branch --tree-filter 'rm -rf DIR/' -- --all
執行過這個指令後,Git 就會把 DIR 這個資料夾、連帶所有相關的紀錄,都一起刪掉了~