<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Git Submodule on 我的技术博客</title><link>https://buvidk1234.github.io/tags/git-submodule/</link><description>Recent content in Git Submodule on 我的技术博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 22 Jul 2026 20:54:40 +0800</lastBuildDate><atom:link href="https://buvidk1234.github.io/tags/git-submodule/index.xml" rel="self" type="application/rss+xml"/><item><title>Git Submodule</title><link>https://buvidk1234.github.io/posts/git-submodule/</link><pubDate>Wed, 22 Jul 2026 20:54:40 +0800</pubDate><guid>https://buvidk1234.github.io/posts/git-submodule/</guid><description>&lt;h1 id="git-submodule原理与协作流程"&gt;Git Submodule：原理与协作流程&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;git submodule&lt;/code&gt; 将一个独立 Git 仓库挂载到另一个仓库的工作树中。被挂载的仓库称为 submodule，外层仓库称为 superproject。父仓库记录的不是子模块文件副本或分支名，而是子仓库的&lt;strong&gt;某个提交 ID&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本文以 Git 官方文档 &lt;a href="https://git-scm.com/docs/gitsubmodules"&gt;gitsubmodules&lt;/a&gt; 为准，使用一个最小的 &lt;code&gt;app&lt;/code&gt; 与 &lt;code&gt;libfoo&lt;/code&gt; 仓库示例说明其工作原理、日常操作和适用边界。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;工作树（working tree）&lt;/strong&gt; 是当前 commit 被检出到文件系统中的文件集合，也就是用户实际查看和修改的目录。它与暂存区和 Git 元数据目录不同：&lt;/p&gt;
&lt;details class="code-fold" open&gt;
&lt;summary&gt;TEXT&lt;/summary&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;工作树 -- git add --&amp;gt; 暂存区（.git/index）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;暂存区 -- git commit -&amp;gt; 提交对象（.git/objects/）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;p&gt;例如，&lt;code&gt;third_party/libfoo&lt;/code&gt; 是 submodule 的工作树；该目录中的文件可以被编辑，但它们的提交历史、索引和对象保存在对应的 Git 目录中。&lt;/p&gt;
&lt;h2 id="submodule-结构"&gt;Submodule 结构&lt;/h2&gt;
&lt;p&gt;设主仓库为 &lt;code&gt;app&lt;/code&gt;，其中有一个子模块 &lt;code&gt;third_party/libfoo&lt;/code&gt;。它们是两个相互独立的仓库：&lt;/p&gt;
&lt;details class="code-fold" open&gt;
&lt;summary&gt;TEXT&lt;/summary&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;app (superproject，父仓库)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .gitmodules # 受版本控制的子模块声明
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── src/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── third_party/libfoo # submodule 工作树，也是独立 Git 仓库
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;p&gt;父仓库的一个提交中，&lt;code&gt;third_party/libfoo&lt;/code&gt; 对应的树项模式是 &lt;code&gt;160000&lt;/code&gt;，Git 称它为 &lt;strong&gt;gitlink&lt;/strong&gt;。其对象 ID 是子仓库的 commit ID，例如：&lt;/p&gt;</description></item></channel></rss>