這是一個 Git 子模塊(submodule)管理問題。當一個 Git 倉庫(主倉庫)中包含多個其他 Git 倉庫(子倉庫)時,最推薦的做法是使用 Git 子模塊 或 Git 子樹(subtree) 進行管理。
? 方案一:使用 Git 子模塊(推薦)
適合需要保持每個子倉庫獨立開發、獨立版本控制的情況。
🔧 使用方法
1. 添加子模塊
git submodule add <子倉庫地址> <子目錄路徑>
例:
git submodule add https://github.com/user/libfoo.git third_party/libfoo
2. 初始化和更新子模塊(拉代碼后)
git submodule init
git submodule update
或直接使用:
git submodule update --init --recursive
3. 拉取主倉庫時帶上子模塊
git clone --recurse-submodules <主倉庫地址>
4. 更新子模塊內容(從遠程)
cd 子模塊路徑
git pull origin main
5. 如果你修改了子模塊,記得在主倉庫也 git add
記錄子模塊新引用。
? 方案二:使用 Git 子樹(subtree)
適合你想把子倉庫代碼直接融合到主倉庫,統一提交,但偶爾同步子倉庫更新。
git subtree add --prefix=third_party/libfoo https://github.com/user/libfoo.git main --squash
然后你可以更新它:
git subtree pull --prefix=third_party/libfoo https://github.com/user/libfoo.git main --squash
?? 如果你直接把多個 .git
倉庫嵌套
如果你在一個 Git 倉庫目錄中直接 git clone
了多個其他倉庫的子目錄,就會出現多個 .git/
,這并不會被主倉庫追蹤,容易混亂。建議換成上面兩種正規方式來管理。
📝 總結
方式 | 特點 | 推薦場景 |
---|---|---|
子模塊 | 輕量,子倉庫獨立存在,適合組件化開發 | 獨立開發、引用外部庫 |
子樹 | 代碼直接嵌入主倉庫,適合一次性集成或者不頻繁更新的依賴 | 想讓倉庫獨立,無需太多外部依賴 |
多 .git 嵌套 | 非標準管理,容易出錯 | ? 不推薦 |
好的!你既然想系統了解 Repo 工具,那我就以教科書式的方式,全面、詳細、通俗易懂地給你介紹這個工具的來龍去脈、核心概念、原理、使用方法、示例項目等。
📦 Repo 工具詳解(Google 開發的 Git 多倉庫管理工具)
一、📖 什么是 Repo 工具?
Repo 是 Google 開發的一個命令行工具,用來統一管理多個 Git 倉庫。
它最早用于 Android 系統源碼的管理,因為 Android 系統是由幾百甚至上千個 Git 倉庫組成的一個工程,傳統的 Git 無法高效管理。
? Repo 是一個「Git 的封裝器(wrapper)」,不替代 Git,而是在 Git 的基礎上工作。
二、📌 Repo 解決了什么問題?
假設場景:
你要參與一個系統項目,代碼由如下 5 個倉庫組成:
倉庫名 | 路徑 |
---|---|
bootloader.git | bootloader/ |
kernel.git | kernel/ |
system.git | system/ |
apps.git | apps/ |
drivers.git | drivers/ |
如果你用 Git:
- 你需要一個一個 clone,搞清楚每個倉庫放哪、用哪個分支、哪個版本。
- 改完一個倉庫要手動記錄更新,容易忘、容易錯。
如果你用 Repo:
- 一份 manifest 文件(XML)就能定義所有倉庫和它們的位置。
- 一條命令
repo sync
就能把所有倉庫都拉下來。 - 統一提交/管理,團隊協作也方便。
三、🔧 Repo 的核心結構和原理
1?? .repo/
目錄
這是 repo 項目的核心管理目錄。
your_project/
├── .repo/
│ ├── manifest.xml ← 定義了所有 Git 倉庫信息
│ ├── manifests/ ← 多個 manifest 文件
│ ├── manifests.git/ ← 存放 manifest 的 Git 倉庫
│ └── repo/ ← repo 腳本本身
2?? manifest.xml(配置清單文件)
這是一個 XML 文件,告訴 repo:
- 要 clone 哪些 Git 倉庫?
- 每個倉庫放在哪個子目錄?
- 默認使用哪個分支?
- 哪些倉庫是必須的?
示例(簡化):
<manifest><remote name="origin"fetch="https://example.com/git/" /><default remote="origin" revision="main" /><project name="kernel.git" path="kernel" /><project name="bootloader.git" path="bootloader" />
</manifest>
四、🧪 實戰:使用 Repo 工具的完整流程
? 環境準備
安裝 repo 工具:
# 推薦方法:從 Google 官方下載
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH # 添加到環境變量
? 初始化倉庫(第一次)
mkdir myproject && cd myproject
repo init -u https://android.googlesource.com/platform/manifest
參數說明:
-u
是 manifest 倉庫的地址- 你也可以加
-b 分支名
指定默認分支
? 同步所有代碼
repo sync
它會自動 clone 所有倉庫,并 checkout 到指定分支。
? 查看當前有哪些倉庫
repo list
? 提交代碼
repo start mybranch --all # 所有倉庫都建一個分支
# 或只對當前目錄建分支
repo start mybranch .# 修改、commit 后
repo status
repo diff
repo upload # 提交改動(上傳到 Gerrit 或類似平臺)
五、🧰 常用 repo 命令總結
命令 | 作用 |
---|---|
repo init | 初始化一個 repo 項目(從 manifest) |
repo sync | 同步所有倉庫的代碼 |
repo start | 給所有倉庫創建分支 |
repo status | 查看所有倉庫的狀態 |
repo diff | 查看當前改動 |
repo upload | 提交更改(上傳到代碼審查平臺) |
repo forall -c "命令" | 對所有倉庫執行某個命令 |
示例:
repo forall -c "git pull"
六、🎯 使用場景
場景 | 是否適合用 Repo |
---|---|
Android 系統源碼 | ? 完美適配 |
鴻蒙 OS / OpenEuler 等大系統 | ? 很多都用 Repo |
多個模塊組件協作項目 | ? 如果用 Git 管理多個模塊 |
小項目 / 單倉庫 | ? 沒必要,用 Git 就夠了 |
七、🚨 注意事項
- repo 工具依賴 manifest 倉庫,不能隨意刪除
.repo/
- 所有子倉庫其實都是 Git 倉庫,你可以進到子目錄用 git 命令操作
repo sync
有時比較慢,可以加-j8
并行加速- 如果你公司內部也用了 Repo,通常 manifest 是私有的,你需要公司內部地址
🧠 總結一句話記住:
Repo 工具就是用來統一管理多個 Git 倉庫的工具,它讓復雜的大工程變得有序可控。
如果你愿意,我可以:
- 手把手帶你搭建一個 mini repo 項目做實戰
- 或者幫你分析你現在遇到的項目是不是在用 repo 工具
你現在是在哪個項目里遇到了 repo?是 Android、RK SDK、還是鴻蒙、公司內系統?我可以給你提供對應的 manifest 示例和命令指南。