目前我有一個 git

資料夾大概是

 

main/aaaa

main/bbbb

main/cccc

 

a b c 都是專案資料夾

會這樣是因為偷懶

直接新增資料夾就不用上去開 repo

因為我這邊正好開 repo 非常麻煩

 

但是遇到 需要把一些專案獨立出來的情況

有辦法針對 a b c 個別專案的 commit 推到送個別 repo ?

 

##############################################

 

 

這是一個很常見的需求,通常稱為 「拆分單一 Repo 其中的子目錄成獨立 Repo」 。

最推薦且不需額外安裝工具的方法是使用 Git 內建的 git subtree  指令。它可以幫你把某個資料夾的歷史紀錄「抽離」出來變成一個新的分支,然後你再將該分支推送到新的 Repo 即可。

以下是操作步驟(以拆分 aaaa  為例):


 

第一步:在原本的 Repo 中進行拆分

請先確保你在 main  的根目錄,且目前的狀態是乾淨的(已經 commit 或 stash):

# 將 aaaa 資料夾的歷史紀錄拆分到一個新的臨時分支,假設叫 split-aaaa

git subtree split -P aaaa -b split-aaaa

 

  • -P aaaa :指定要拆分的資料夾路徑。
  • -b split-aaaa :指定拆分出的歷史要放進哪一個新分支。

第二步:建立新的 Repository 並推送

  1. 去你的 Git Server(如 GitHub/GitLab)開好一個新的 Empty Repo。
  2. 在本地建立一個全新的資料夾,或是直接從原本的地方推過去:

方法 A:直接推送到新 Repo(最快)

# 新增遠端倉庫位址

git remote add repo-aaaa <新Repo的URL>



# 將剛剛拆分出來的分支推送到新 Repo 的 main

git push repo-aaaa split-aaaa:main

 

方法 B:先在本機建立新資料夾再關聯

 

mkdir project-aaaa

cd project-aaaa

git init

# 從原本的 main repo 把那個分支拉過來

git pull ../main split-aaaa

 

第三步:後續處理(選用)

如果你希望原本的 main  保持乾淨,不再包含 aaaa  的內容,可以在 main  分支中直接將該資料夾刪除:

 

git rm -r aaaa

git commit -m "Remove aaaa after splitting to a separate repo"

 


 

注意事項

  • 歷史紀錄:   git subtree  會保留所有與該資料夾相關的 commit 紀錄。如果你的 commit 內容同時修改了 aaaa  跟 bbbb ,在拆分後的 aaaa  Repo 中,只會看到與 aaaa  變動相關的部分。
  • 大檔案:  如果原本的 Repo 很大,拆分過程可能會花一點點時間計算。
  • 推薦工具:  如果你的專案歷史極其龐大,或是需要更精細的過濾(例如排除某些檔案),可以考慮使用   git-filter-repo (這是官方目前推薦用來取代 filter-branch  的強大工具)。

 

 

##############################################

 

有時候就是這樣

行政流程麻煩的要命

權限的鎖很死

有時候就是這樣

原本可能設想美好的規則

但是發現實際運作亂得要命

就愈來越亂了 XD

 

不過至少是在 git 上

絕對比沒有用 git 好上萬倍