git submodule

子模块允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。
它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立

帮助文档

1
2
3
4
5
6
7
8
9
usage: git submodule [--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <repository>] [--] <repository> [<path>]
or: git submodule [--quiet] status [--cached] [--recursive] [--] [<path>...]
or: git submodule [--quiet] init [--] [<path>...]
or: git submodule [--quiet] deinit [-f|--force] (--all| [--] <path>...)
or: git submodule [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--checkout|--merge|--rebase] [--[no-]recommend-shallow] [--reference <repository>] [--recursive] [--] [<path>...]
or: git submodule [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
or: git submodule [--quiet] foreach [--recursive] <command>
or: git submodule [--quiet] sync [--recursive] [--] [<path>...]
or: git submodule [--quiet] absorbgitdirs [--] [<path>...]

创建的配置文件

  • .gitmodules
    1
    2
    3
    [submodule "themes/next"]
    path = themes/next
    url = git@github.com:VideoTec/hexo-theme-next.git

子模块文件夹 虽然是工作目录中的一个子目录,但 Git 还是会将它视作一个子模块。
当你不在那个目录中时,Git 并不会跟踪它的内容, 而是将它看作该仓库中的一个特殊提交

资料

Git 工具 - 子模块

例子

  • 增加子模块

    1
    2
    git submodule add https://github.com/chaconinc/DbConnector
    git submodule add https://github.com/iissnan/hexo-theme-next themes/next
  • 删除子模块
    way-to-remove-a-git-submodule

    1
    2
    3
    4
    5
    6
    git submodule deinit <asubmodule>    
    git rm <asubmodule>
    # Note: asubmodule (no trailing slash)
    # or, if you want to leave it in your working tree
    git rm --cached <asubmodule>
    rm -rf .git/modules/<asubmodule>
  • 克隆仓库后,第一次拉取子模块的,需要初始化
    git submodule init

  • 列出所有子模块
    git submodule status
  • 拉取子模块
    git submodule update

拉取子模块时的错误

1
2
3
> $ git submodule update .deploy_git
> Fetched in submodule path '.deploy_git', but it did not contain d0146b46d71549946f37804f694af92b9db0a9e7. Direct fetching of that commit failed.
>

解决办法,cd,到子模块目录,使用 git status 查看状态,进行处理。