分割 Git Repository

在 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 這個資料夾、連帶所有相關的紀錄,都一起刪掉了~


另外也可以參考《Detach subdirectory into separate Git repository 》。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。