目前我有一個 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 並推送
- 去你的 Git Server(如 GitHub/GitLab)開好一個新的 Empty Repo。
- 在本地建立一個全新的資料夾,或是直接從原本的地方推過去:
方法 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 好上萬倍![]()

留言板
歡迎留下建議與分享!希望一起交流!感恩!