# 如何無縫分拆Git Repo? 最近負責把團隊內的 TFS Git 倉庫搬移到 Gitlab 倉庫,並對特定的倉庫做了一次分拆。 專案開發初期為了圖方便,所有東西通通放到同一倉庫,但是經年累月下來隨著專案迭代、人力發展、花式玩法後逐漸付出各種問題,其主要痛點有以下: 1. 存取權限控管:無法達到最小範圍、按需授權等原則、最大限度保護程式碼外洩可能,現有的大鍋飯模式,是無法滿足達成的。 2. 空間肥大:會取得很多我不相關的內容,未來CI/CD實作後可能會影響到運作效率。 3. 衝突:合併程式碼衝突機率逐步增高,且一旦衝突就要需要花費許多時間去解衝突、甚至不小心蓋掉其他人程式碼。 同時也希望倉庫拆分後能同時保留歷史Commit紀錄,以利後續追查與回溯狀況。 ## 前提 * git 版本要 >= 2.22.0 * 使用前請先安裝 `git-filter-repo ` 套件,安裝過程相當簡易詳請自行參閱[安裝指南](https://github.com/newren/git-filter-repo/blob/main/INSTALL.md)。 * 建議重新clone一份新的、乾淨的倉庫 ## 開始分拆與執行步驟 ### Step 1. Clone要拆分的倉庫 ``` git clone https://github.com/yphs99/Repo-Split-Testing.git ``` ### Step 2. 將工作目錄切換到Clone回來的倉資料夾 ``` cd Repo-Split-Testing ``` ### Step 3. 從倉庫中的指定欲保存的Order資料夾名稱,並將該資料夾提升為根目錄 ``` git filter-repo --subdirectory-filter 'Order/' ``` ### Step 4. 分拆完了!最後觀看與確認分拆結果,無誤後 push 回 Git Repo 上 ![](https://github.com/yphs99/Repo-Split-Testing/raw/main/SplitResult.jpg) ## 更多相關命令簡介 本文僅針對本次需求介紹所需用到的指令,若需其他指令建議請觀看 `git-filter-repo` 的[說明文件](https://github.com/newren/git-filter-repo#readme),裡面可以看到有更多指令說明與範例。 > 本文[同步](https://tech.cmoney.tw/%e5%a6%82%e4%bd%95%e7%84%a1%e7%b8%ab%e5%88%86%e6%8b%86git-repo/)發表於CMoney工程部Blog