2025/03/10

透過 Git Subtree 無痛整合 GitHub 上的既有專案

Git Subtree 輕鬆合併專案,保留完整 commit 歷史

在軟體開發的過程中,時常會遇到這樣的需求:

  • 你有一個現有的 Git 專案,但需要將另一個儲存庫的內容整合進來,並且希望保留完整的 commit 歷史。

這時,Git 提供了幾種不同的方式來達成這個目標,其中 Git Subtree 是一個簡單又強大的解法。

本文將帶你了解 Git Subtree 的用途、與 Submodule 的差異,以及如何實際操作,讓你的開發流程更順暢!


為什麼需要整合外部 Git 儲存庫?

在多人協作或模組化開發的情境下,將外部專案整合到目前的主專案中是相當常見的需求,例如:

  • 你正在開發一個 微服務架構,每個服務有獨立的 Git 儲存庫,但你希望它們統一管理在同一個專案下。
  • 你的專案需要引入某個 舊專案的程式碼,但你又不想失去它的歷史紀錄。

Git Submodule vs. Git Subtree:哪種適合你?

Git Submodule

  • 概念: Submodule 會把另一個 Git 儲存庫當作「子模組」,專案本身只會記錄這個子模組的「版本指標」,但不會直接包含它的內容。
  • 優點: 保持外部專案的獨立性,適合用於需要獨立維護的第三方庫。
  • 缺點: 需要額外管理 Submodule 的版本,對團隊協作來說較為複雜。

Git Subtree

  • 概念: Subtree 會直接把外部儲存庫的內容合併到專案內的某個子目錄,並保留完整的 commit 歷史。
  • 優點: 外部專案的內容會直接存在於主專案中,使用上較直覺。
  • 缺點: 如果外部專案頻繁更新,需要手動執行 git subtree pull 來同步變更。

使用 Git Subtree 合併外部儲存庫

1. 新增外部儲存庫作為遠端

git remote add your-old-repo git@github.com:xxxx/aabbb.git

2. 拉取外部儲存庫的內容

git fetch your-old-repo --no-tags

3. 使用 Git Subtree 合併外部專案

git subtree add --prefix=apps/testa your-old-repo master

4. 移除不需要的遠端設定

git remote remove your-old-repo

5. 推送變更到遠端儲存庫

git push origin master

如何同步外部專案的更新?

如果外部專案(your-old-repo)有新的變更,你可以使用以下指令同步:

git subtree pull --prefix=apps/testa your-old-repo master

總結

Git Subtree 提供了一種簡單且直覺的方式,讓我們可以將外部專案的內容整合進來,並且保留完整的 commit 歷史。

  • 如果你不想要處理 Submodule 帶來的繁瑣設定,Git Subtree 會是更好的選擇。
  • 透過 git subtree pull 可以輕鬆同步上游變更,保持程式碼最新。

希望這篇文章能幫助你更順利地整合不同的 Git 儲存庫,讓你的開發流程更順暢! 🚀