git submodule 和git repo介紹

這是一個 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.gitbootloader/
kernel.gitkernel/
system.gitsystem/
apps.gitapps/
drivers.gitdrivers/
如果你用 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 示例和命令指南。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84326.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

識別網絡延遲與帶寬瓶頸

識別網絡延遲與帶寬瓶頸 在分布式系統與微服務架構日益普及的背景下,網絡性能成為影響系統響應速度與服務可用性的重要因素。網絡延遲和帶寬瓶頸是兩類最常見的網絡性能障礙。準確識別這兩類瓶頸,有助于系統架構師從根源優化服務質量,保障系統在高并發、高流量場景下依然具…

Linux內網穿透(frp)

目標&#xff1a;讓我的VMware虛擬機某個服務擁有自己的外網訪問地址 FRP 服務端&#xff08;公網服務器&#xff09;配置 1. 下載 FRP 登錄公網服務器&#xff0c;執行以下命令下載并解壓 FRP&#xff1a; # 下載對應版本&#xff08;以Linux 64位為例&#xff09; wget h…

《Vuejs設計與實現》第 9 章(簡單 diff 算法)

目錄 9.1 減少 DOM 操作的性能開銷 9.2 DOM 復用與 key 的作用 9.3 找到需要移動的元素 9.4 如何移動元素 9.5 添加新元素 9.6 移除不存在的元素 9.7 總結 當新舊 vnode 的子節點都是一組節點時&#xff0c;為了以最小的性能開銷完成更新操作&#xff0c;需要比較兩組子…

隊列,環形緩沖區實現與應用:適用于GD32串口編程或嵌入式底層驅動開發

環形緩沖區實現與應用&#xff1a;從基礎到實踐 在嵌入式系統和實時數據處理場景中&#xff0c;環形緩沖區&#xff08;Circular Buffer&#xff09;是一種非常常用的的數據結構&#xff0c;它能有效地管理數據的讀寫操作&#xff0c;尤其適用于數據流的臨時存儲與轉發。 今天…

WHAT - Expo Go 和 development build

文章目錄 1. 什么是 Expo Go?簡介作用限制2. 什么是 Development Build(開發構建)?簡介功能創建方式3. 它們有什么區別?總結建議怎么從 Expo Go 遷移到開發構建一、什么是“遷移”?二、遷移步驟總覽三、詳細操作步驟1. 安裝 expo-dev-client2. 配置 eas.json(Expo 應用服…

Keepalived 配置 VIP 的核心步驟

Keepalived 配置 VIP 的核心步驟主要涉及安裝軟件、主備節點配置及服務管理。以下是具體操作指南: 一、安裝 Keepalived ?Ubuntu/Debian 系統? sudo apt update sudo apt install keepalived ?CentOS/RHEL 系統? sudo yum install keepalived 注:需確保已配置 EPE…

HarmonyOS 5折疊屏自適應廣告位布局方案詳解

以下是HarmonyOS 5折疊屏廣告位自適應布局的完整技術方案&#xff0c;綜合響應式設計、動態交互與元服務融合策略&#xff1a; 一、核心布局技術? ?斷點響應式設計? 基于屏幕寬度動態調整布局結構&#xff0c;避免簡單拉伸&#xff1a; // 定義斷點閾值&#xff08;單位&am…

【數據分析十:Classification prediction】分類預測

一、分類的定義 已知&#xff1a;一組數據&#xff08;訓練集&#xff09; (X, Y) 例如&#xff1a; x&#xff1a;數據特征/屬性&#xff08;如收入&#xff09; y&#xff1a;類別標記&#xff08;是否有借款&#xff09; 任務: 學習一個模型&#xff0c;利用每一條記錄…

設計模式-接口隔離原則(Interface Segregation Principle, ISP)

接口隔離原則&#xff08;Interface Segregation Principle, ISP&#xff09; 核心思想&#xff1a;客戶端不應被迫依賴它們不使用的接口方法。 目標&#xff1a;通過拆分臃腫的接口為更小、更具體的接口&#xff0c;減少不必要的依賴&#xff0c;提高系統的靈活性和可維護性。…

超融合:系統工程還是軟件工程? 從H3C UIS9.0看超融合的技術本質

在數字化轉型的浪潮中&#xff0c;超融合基礎架構&#xff08;Hyper-Converged Infrastructure, HCI&#xff09;憑借其簡化部署、彈性擴展和高效運維的優勢&#xff0c;成為企業IT基礎設施升級的重要選擇。 然而&#xff0c;關于超融合究竟屬于系統工程還是軟件工程的討論一直…

青少年編程與數學 01-012 通用應用軟件簡介 01 Microsoft Office辦公軟件

青少年編程與數學 01-012 通用應用軟件簡介 01 Microsoft Office辦公軟件 **一、Microsoft Office辦公軟件概述****二、發展過程**&#xff08;一&#xff09;早期起源&#xff08;二&#xff09;技術演進 **三、主要用途或功能**&#xff08;一&#xff09;文字處理&#xff0…

vivado IP綜合選項

在 Vivado 中&#xff0c;生成 IP 文件時的 Synthesis Options 提供了兩種主要的綜合模式&#xff1a;Global 和 Out of Context per IP。這兩種模式的主要區別如下&#xff1a; 1. Global Synthesis&#xff08;全局綜合&#xff09; 定義&#xff1a;在這種模式下&#xff…

零信任一招解決智慧校園的遠程訪問、數據防泄露、安全運維難題

隨著數字化轉型持續深入&#xff0c;“智慧校園”已成為高校發展的必經之路。從統一門戶、一卡通到教務系統、選課系統&#xff0c;各類應用極大地便利了師生的工作與學習。 然而&#xff0c;便捷的背后也隱藏著一系列安全挑戰。為了滿足師生校外訪問的需求&#xff0c;許多應…

web布局08

flex-basis 是 Flexbox 布局模塊中 flex 屬性的另一個子屬性&#xff0c;在前面的課程中我們深度剖析了瀏覽器是如何計算 Flex 項目尺寸的&#xff0c;或者說 Flexbox 是如何工作的。對于眾多 Web 開發者而言&#xff0c;在 CSS 中都習慣于使用像 width 、height 、min-* 和 ma…

在 Docker 27.3.1 中安裝 PostgreSQL 16 的實踐

前言&#xff1a;為什么在 Docker 中部署 PostgreSQL&#xff1f; 在云原生時代&#xff0c;容器化部署已成為生產環境的首選方案。通過 Docker 部署 PostgreSQL 具有以下顯著優勢&#xff1a; 環境一致性&#xff1a;消除“在我機器上能運行”的問題快速部署&#xff1a;秒級…

日志混亂與數據不一致問題實戰排查:工具協同調試記錄(含克魔使用點)

日志調試、狀態驗證和數據一致性排查&#xff0c;是iOS開發中最費時間、最易出錯的工作之一。尤其是在模塊之間異步通信頻繁、本地緩存與遠程狀態需保持同步時&#xff0c;如果缺乏一套合適的流程與工具&#xff0c;開發人員極容易陷入“盲查狀態”。 在一次跨部門聯合開發的A…

Redis底層數據結構與內部實現

目錄 一、RedisDB結構 1、RedisDB在Redis實例中的位置 2、RedisDB結構與核心組件 二、RedisObject結構 1、核心數據結構 1.1 簡單動態字符串 (Simple Dynamic String - SDS) 1.2 字典 (Dict / Hash Table) 1.3 雙端鏈表 (Linked List) 1.4 跳躍表 (Skip List) 1.5 壓…

【項目實訓】【項目博客#07】HarmonySmartCodingSystem系統前端開發技術詳解(5.12-6.15)

【項目實訓】【項目博客#07】HarmonySmartCodingSystem系統前端開發技術詳解&#xff08;5.12-6.15&#xff09; 一、項目概述與目標 HarmonySmartCodingSystem是一個面向HarmonyOS開發者的智能編碼輔助平臺&#xff0c;旨在通過自然語言交互簡化開發流程&#xff0c;提供智能…

系統性能優化-2 CPU

系統性能優化-2 CPU 其實除了 CPU 的頻率&#xff0c;多核架構以及多 CPU 架構對系統運行的性能也是很大影響的&#xff0c;那么該如何充分利用 CPU 呢&#xff1f; CPU 架構 首先介紹一下當前主流的 CPU 架構&#xff0c;現在的系統基本都是多 CPU&#xff0c;一個 CPU 處理…

Docker Pull 相關配置指南

在Docker環境中&#xff0c;docker pull命令用于從Docker鏡像倉庫拉取鏡像。為了確保Docker鏡像能夠快速、穩定地拉取&#xff0c;配置 docker pull相關的設置是非常重要的。本文將詳細介紹如何配置Docker以優化 docker pull操作&#xff0c;涵蓋鏡像源配置、登錄私有倉庫、網絡…