设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.53.0 无变更
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 无更改
-
2.51.0
2025-08-18
- 2.47.1 → 2.50.1 无更改
-
2.47.0
2024-10-06
- 2.44.1 → 2.46.4 无更改
-
2.44.0
2024-02-23
- 2.42.1 → 2.43.7 无变更
-
2.42.0
2023-08-21
- 2.36.1 → 2.41.3 无更改
-
2.36.0
2022-04-18
- 2.28.1 → 2.35.8 无变更
-
2.28.0
2020-07-27
- 2.26.1 → 2.27.1 无变更
-
2.26.0
2020-03-22
- 2.25.2 → 2.25.5 无更改
-
2.25.1
2020-02-17
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 无更改
-
2.24.0
2019-11-04
- 2.22.1 → 2.23.4 无更改
-
2.22.0
2019-06-07
- 2.19.1 → 2.21.4 无更改
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 无更改
-
2.18.0
2018-06-21
- 2.17.0 → 2.17.6 无更改
-
2.16.6
2019-12-06
- 2.15.4 无更改
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
- 2.11.4 无更改
-
2.10.5
2017-09-22
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.7.6 无更改
-
2.6.7
2017-05-05
- 2.5.6 无更改
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
- 2.1.4 → 2.2.3 无更改
-
2.0.5
2014-12-17
概要
git submodule [--quiet] [--cached]
git submodule [--quiet] add [<options>] [--] <repository> [<path>]
git submodule [--quiet] status [--cached] [--recursive] [--] [<path>…]
git submodule [--quiet] init [--] [<path>…]
git submodule [--quiet] deinit [-f|--force] (--all|[--] <path>…)
git submodule [--quiet] update [<options>] [--] [<path>…]
git submodule [--quiet] set-branch [<options>] [--] <path>
git submodule [--quiet] set-url [--] <path> <newurl>
git submodule [--quiet] summary [<options>] [--] [<path>…]
git submodule [--quiet] foreach [--recursive] <command>
git submodule [--quiet] sync [--recursive] [--] [<path>…]
git submodule [--quiet] absorbgitdirs [--] [<path>…]
描述
检查、更新和管理子模块。
有关子模块的更多信息,请参阅 gitsubmodules[7]。
命令
如果不带参数,则显示现有子模块的状态。有多个子命令可用于对子模块执行操作。
- add [-b <分支>] [-f|--force] [--name <名称>] [--reference <仓库>] [--ref-format <格式>] [--depth <深度>] [--] <仓库> [<路径>]
-
将给定的仓库作为子模块添加到当前项目的给定路径下,并准备在下一次提交时提交:当前项目被称为“父项目(superproject)”。
<仓库> 是新子模块源仓库的 URL。它可以是绝对 URL,也可以是相对于父项目默认远程仓库的路径(如果以 ./ 或 ../ 开头)。(请注意,要指定一个位于父项目 bar.git 旁边的仓库 foo.git,您必须使用
../foo.git而不是./foo.git—— 尽管在遵循相对 URL 规则时可能预期后者 —— 因为 Git 中相对 URL 的计算方式与相对目录完全相同)。默认远程仓库是当前分支的远程跟踪分支的远程仓库。如果不存在此类远程跟踪分支或 HEAD 处于游离状态,则假定 "origin" 为默认远程仓库。如果父项目没有配置默认远程仓库,则父项目本身就是其权威上游,并改用当前工作目录。
可选参数 <路径> 是克隆子模块在父项目中的相对位置。如果没有给出 <路径>,则使用源仓库的规范部分("/path/to/repo.git" 为 "repo","host.xz:foo/.git" 为 "foo")。如果 <路径> 存在且已经是一个有效的 Git 仓库,则它会被暂存以供提交而无需克隆。除非使用
--name指定了逻辑名称,否则 <路径> 也会用作其配置条目中子模块的逻辑名称。给定的 URL 会记录在
.gitmodules中,供后续克隆父项目的用户使用。如果 URL 是相对于父项目仓库给出的,则假设父项目和子模块仓库将保持在相同的相对位置,只需提供父项目的 URL。git-submodule 将使用.gitmodules中的相对 URL 正确定位子模块。如果指定了
--ref-format<格式>,新克隆的子模块的引用存储格式将相应设置。 - status [--cached] [--recursive] [--] [<路径>…]
-
显示子模块的状态。这将打印每个子模块当前检出提交的 SHA-1,以及子模块路径和该 SHA-1 的 git describe 输出。如果子模块未初始化,每个 SHA-1 可能会带上前缀
-;如果当前检出的子模块提交与包含仓库索引中找到的 SHA-1 不匹配,则带上前缀+;如果子模块存在合并冲突,则带上前缀U。如果指定了
--cached,此命令将改为打印父项目中为每个子模块记录的 SHA-1。如果指定了
--recursive,此命令将递归进入嵌套子模块,并显示它们的状态。如果您只对当前已初始化的子模块相对于索引或 HEAD 中记录的提交的更改感兴趣,git-status[1] 和 git-diff[1] 也会提供这些信息(还可以报告子模块工作树的更改)。
- init [--] [<路径>…]
-
通过在
.git/config中设置submodule.$name.url来初始化索引中记录的子模块(这些子模块已在别处添加并提交),使用.gitmodules中的相同设置作为模板。如果 URL 是相对路径,它将使用默认远程仓库进行解析。如果没有默认远程仓库,则假定当前仓库为上游。可选的 <路径> 参数限制了将要初始化的子模块。如果没有指定路径且配置了 submodule.active,则配置为激活的子模块将被初始化,否则所有子模块都会被初始化。
如果
.gitmodules文件中存在submodule.$name.update的值,它还会将其复制到.git/config中,但是 (1) 此命令不会更改.git/config中的现有信息,并且 (2) 出于安全原因,设置为自定义命令的submodule.$name.update不会被复制。然后,您可以针对本地设置在
.git/config中自定义子模块克隆 URL,并继续执行gitsubmoduleupdate;如果您不打算自定义任何子模块位置,也可以直接使用gitsubmoduleupdate--init,而无需显式的 init 步骤。有关默认远程仓库的定义,请参阅 add 子命令。
- deinit [-f|--force] (--all|[--] <路径>…)
-
注销给定的子模块,即从 .git/config 中删除整个
submodule.$name部分及其工作树。随后调用的gitsubmoduleupdate、gitsubmoduleforeach和gitsubmodulesync将跳过任何未注销的子模块,直到它们再次被初始化,因此如果您不想再在工作树中保留子模块的本地检出,请使用此命令。当命令运行时没有路径规范时,它会报错而不是注销所有内容,以防止误操作。
如果指定了
--force,即使子模块的工作树包含本地修改,也会被移除。如果您确实想从仓库中删除一个子模块并提交,请改用 git-rm[1]。有关删除选项,请参阅 gitsubmodules[7]。
- update [--init] [--remote] [-N|--no-fetch] [--[no-]recommend-shallow] [-f|--force] [--checkout|--rebase|--merge] [--reference <仓库>] [--ref-format <格式>] [--depth <深度>] [--recursive] [--jobs <n>] [--[no-]single-branch] [--filter <过滤器规范>] [--] [<路径>…]
-
通过克隆缺失的子模块、获取子模块中缺失的提交以及更新子模块的工作树,使已注册的子模块与父项目的预期相匹配。“更新”可以通过几种方式完成,具体取决于命令行选项和
submodule.<名称>.update配置变量的值。命令行选项优先于配置变量。如果两者都没有给出,则执行 checkout。(注意:此时.gitmodules文件中的内容无关紧要;有关如何使用.gitmodules,请参阅上面的gitsubmoduleinit)。命令行以及通过submodule.<名称>.update配置支持的更新程序包括:以下更新程序具有额外的限制:
如果子模块尚未初始化,而您只想使用
.gitmodules中存储的设置,则可以使用--init选项自动初始化子模块。如果指定了
--recursive,此命令将递归进入已注册的子模块,并更新其中的任何嵌套子模块。如果指定了
--ref-format<格式>,新克隆的子模块的引用存储格式将相应设置。如果指定了
--filter<过滤器规范>,给定的部分克隆过滤器将应用于子模块。有关过滤器规范的详细信息,请参阅 git-rev-list[1]。 - set-branch (-b|--branch) <分支> [--] <路径>
- set-branch (-d|--default) [--] <路径>
-
设置子模块的默认远程跟踪分支。
--branch选项允许指定远程分支。--default选项移除 submodule.<name>.branch 配置键,这将导致跟踪分支默认为远程 HEAD。 - set-url [--] <路径> <新URL>
-
将指定子模块的 URL 设置为 <新URL>。然后,它将自动同步子模块的新远程 URL 配置。
- summary [--cached|--files] [(-n|--summary-limit) <n>] [commit] [--] [<路径>…]
-
显示给定提交(默认为 HEAD)与工作树/索引之间的提交摘要。对于相关的子模块,会显示子模块中在给定的父项目提交与索引或工作树(通过
--cached切换)之间的一系列提交。如果给出了--files选项,则显示子模块在父项目索引与子模块工作树之间的一系列提交(此选项不允许使用--cached选项或提供显式提交)。在 git-diff[1] 中使用
--submodule=log选项也会提供这些信息。 - foreach [--recursive] <命令>
-
在每个检出的子模块中执行任意 shell 命令。该命令可以访问变量 $name、$sm_path、$displaypath、$sha1 和 $toplevel:$name 是
.gitmodules中相关子模块部分的名称,$sm_path 是直接父项目中记录的子模块路径,$displaypath 包含从当前工作目录到子模块根目录的相对路径,$sha1 是直接父项目中记录的提交,而 $toplevel 是直接父项目顶层的绝对路径。请注意,为了避免与 Windows 上的 $PATH 冲突,$path 变量现在是 $sm_path 变量的已弃用同义词。父项目中定义但未检出的任何子模块都会被此命令忽略。除非给出了--quiet,否则 foreach 在执行命令之前会打印每个子模块的名称。如果给出了--recursive,则递归遍历子模块(即在嵌套子模块中也会执行给定的 shell 命令)。在任何子模块中,如果命令返回非零值,都会导致处理终止。这可以通过在命令末尾添加 || : 来覆盖。例如,下面的命令将显示每个子模块的路径和当前检出的提交
git submodule foreach 'echo $sm_path `git rev-parse HEAD`'
- sync [--recursive] [--] [<路径>…]
-
将子模块的远程 URL 配置设置同步到
.gitmodules中指定的值。它只会影响那些已经在 .git/config 中有 URL 条目的子模块(即它们已被初始化或新添加的情况)。当上游子模块 URL 发生变化且您需要相应更新本地仓库时,这非常有用。gitsubmodulesync同步所有子模块,而gitsubmodulesync--A仅同步子模块 "A"。如果指定了
--recursive,此命令将递归进入已注册的子模块,并同步其中的任何嵌套子模块。 - absorbgitdirs
-
如果子模块的 git 目录位于子模块内部,则将子模块的 git 目录移至其父项目的
$GIT_DIR/modules路径,然后通过设置core.worktree并添加一个指向嵌入在父项目 git 目录中的 git 目录的 .git 文件,连接 git 目录及其工作目录。独立克隆并随后作为子模块添加的仓库,或旧的设置,其子模块 git 目录位于子模块内部,而不是嵌入在父项目的 git 目录中。
此命令默认是递归的。
选项
- -q
- --quiet
-
仅打印错误消息。
- --progress
-
此选项仅对 add 和 update 命令有效。默认情况下,如果标准错误流连接到终端,进度状态会报告在标准错误流上,除非指定了 -q。即使标准错误流没有指向终端,此标志也会强制显示进度状态。
- --all
-
此选项仅对 deinit 命令有效。注销工作树中的所有子模块。
- -b <分支>
- --branch <分支>
-
要作为子模块添加的仓库分支。分支名称在
.gitmodules中记录为submodule.<名称>.branch,供update--remote使用。特殊值.用于指示子模块中的分支名称应与当前仓库中的当前分支名称相同。如果未指定该选项,则默认为远程 HEAD。 - -f
- --force
-
此选项仅对 add、deinit 和 update 命令有效。运行 add 时,允许添加原本被忽略的子模块路径。此选项还用于绕过子模块名称是否已被使用的检查。默认情况下,如果提议的名称(派生自路径)已在仓库中为另一个子模块注册,则 git submodule add 将失败。使用 --force 允许命令通过自动生成唯一名称(在冲突名称后附加数字)继续进行(例如,如果名为 child 的子模块已存在,它将尝试 child1,依此类推)。运行 deinit 时,即使子模块工作树包含本地更改,也将被移除。运行 update 时(仅对 checkout 程序有效),在切换到不同提交时丢弃子模块中的本地更改;并且始终在子模块中运行检出操作,即使包含仓库索引中列出的提交与子模块中检出的提交相匹配。
- --cached
-
此选项仅对 status 和 summary 命令有效。这些命令通常使用子模块 HEAD 中找到的提交,但使用此选项后,将改用索引中存储的提交。
- --files
-
此选项仅对 summary 命令有效。使用此选项时,此命令将索引中的提交与子模块 HEAD 中的提交进行比较。
- -n
- --summary-limit
-
此选项仅对 summary 命令有效。限制摘要大小(总共显示的提交数量)。给出 0 将禁用摘要;负数表示不限制(默认值)。此限制仅适用于已修改的子模块。对于已添加/已删除/类型更改的子模块,大小始终限制为 1。
- --remote
-
此选项仅对 update 命令有效。不使用父项目记录的 SHA-1 来更新子模块,而是使用子模块远程跟踪分支的状态。使用的远程仓库是分支的远程仓库(
branch.<名称>.remote),默认为origin。使用的远程分支默认为远程HEAD,但分支名称可以通过在.gitmodules或.git/config中设置submodule.<名称>.branch选项来覆盖(以.git/config为准)。这适用于任何受支持的更新程序(
--checkout、--rebase等)。唯一的改变是目标 SHA-1 的来源。例如,submoduleupdate--remote--merge会将上游子模块的更改合并到子模块中,而submoduleupdate--merge会将父项目的 gitlink 更改合并到子模块中。为了确保跟踪分支状态是最新的,
update--remote在计算 SHA-1 之前会获取子模块的远程仓库。如果您不想获取,应使用submoduleupdate--remote--no-fetch。使用此选项可将上游子项目的更改与子模块的当前 HEAD 整合。或者,您可以从子模块运行
gitpull,除了远程分支名称外,这与其等效:update--remote使用默认上游仓库和submodule.<名称>.branch,而gitpull使用子模块的branch.<名称>.merge。如果您想随父项目分发默认上游分支,请首选submodule.<名称>.branch;如果您想在子模块本身工作时获得更原生的感觉,请首选branch.<名称>.merge。 - -N
- --no-fetch
-
此选项仅对 update 命令有效。不从远程站点获取新对象。
- --checkout
-
此选项仅对 update 命令有效。在子模块中以游离 HEAD 检出父项目中记录的提交。这是默认行为,此选项的主要用途是当
submodule.$name.update设置为checkout以外的值时覆盖它。如果submodule.$name.update键未显式设置或设置为checkout,则此选项是隐式的。 - --merge
-
此选项仅对 update 命令有效。将父项目中记录的提交合并到子模块的当前分支中。如果给出此选项,子模块的 HEAD 将不会游离。如果合并失败阻止了此过程,您必须使用通常的冲突解决工具在子模块内解决由此产生的冲突。如果
submodule.$name.update键设置为merge,则此选项是隐式的。 - --rebase
-
此选项仅对 update 命令有效。将当前分支变基到父项目中记录的提交上。如果给出此选项,子模块的 HEAD 将不会游离。如果合并失败阻止了此过程,您必须使用 git-rebase[1] 解决这些失败。如果
submodule.$name.update键设置为rebase,则此选项是隐式的。 - --init
-
此选项仅对 update 命令有效。在更新之前,初始化所有到目前为止尚未调用 "git submodule init" 的子模块。
- --name
-
此选项仅对 add 命令有效。它将子模块的名称设置为给定的字符串,而不是默认为其路径。名称必须是有效的目录名称,且不能以 / 结尾。
- --reference <仓库>
-
此选项仅对 add 和 update 命令有效。这些命令有时需要克隆远程仓库。在这种情况下,此选项将传递给 git-clone[1] 命令。
注意:除非您已仔细阅读 git-clone[1] 的
--reference、--shared和--dissociate选项的说明,否则不要使用此选项。 - --dissociate
-
此选项仅对 add 和 update 命令有效。这些命令有时需要克隆远程仓库。在这种情况下,此选项将传递给 git-clone[1] 命令。
注意:请参阅
--reference选项的注意说明。 - --recursive
-
此选项仅对 foreach、update、status 和 sync 命令有效。递归遍历子模块。该操作不仅在当前仓库的子模块中执行,而且在这些子模块内的任何嵌套子模块中(依此类推)执行。
- --depth
-
此选项对 add 和 update 命令有效。创建一个历史记录截断为指定修订次数的浅层(shallow)克隆。参见 git-clone[1]
- --recommend-shallow
- --no-recommend-shallow
-
此选项仅对 update 命令有效。默认情况下,子模块的初始克隆将使用
.gitmodules文件提供的推荐submodule.<名称>.shallow设置。要忽略这些建议,请使用--no-recommend-shallow。 - -j <n>
- --jobs <n>
-
此选项仅对 update 命令有效。并行克隆新子模块的作业数。默认为
submodule.fetchJobs选项的值。 - --single-branch
- --no-single-branch
-
此选项仅对 update 命令有效。在更新期间仅克隆一个分支:HEAD 或由 --branch 指定的分支。
- <路径>…
-
子模块的路径。指定后,这将限制命令仅对在指定路径找到的子模块进行操作。(add 命令必须提供此参数)。
文件
初始化子模块时,使用包含仓库顶层目录中的 .gitmodules 文件来查找每个子模块的 url。此文件的格式应与 $GIT_DIR/config 相同。每个子模块 url 的键是 "submodule.$name.url"。详见 gitmodules[5]。