由于Git项目多包含子模块(submodule)的Git仓库。子模块是一个独立的Git仓库,被做为父仓库的一部分进行管理
当使用git clone git_url
是,默认不会clone
子模块,这时就可以使用git clone --recursive
命令递归克隆一个包含子模块的仓库,
具体来说,git clone --recursive 命令会执行以下操作:
- 克隆父仓库,并将其初始化为一个 Git 仓库。
- 检查父仓库中是否包含子模块。
- 如果父仓库包含子模块,则自动克隆并初始化每个子模块的仓库。
- 将子模块的仓库与父仓库进行关联。
这样,你就能够获取包含子模块的完整代码库,包括父仓库和所有子模块的代码。
但是由于网络等未知原因,克隆父仓库的时候无法克隆子模组。
此时可以待父仓库克隆成功以后进入到项目目录使用git submodule update --init --recursive
命令继续克隆子模块。
此命令可以重复执行,直到不提示失败,没有任何输出位置
例如克隆一个包含多个子模块的项目:
[jorelhan@JorelMBP OpenSource]$ git clone git@github.com:gnachman/iTerm2.git
Cloning into 'iTerm2'...
remote: Enumerating objects: 122646, done.
remote: Counting objects: 100% (5940/5940), done.
remote: Compressing objects: 100% (757/757), done.
remote: Total 122646 (delta 5231), reused 5668 (delta 5124), pack-reused 116706
Receiving objects: 100% (122646/122646), 223.49 MiB | 5.65 MiB/s, done.
Resolving deltas: 100% (90076/90076), done.
[jorelhan@JorelMBP iTerm2]$ git submodule update --init --recursive
Submodule 'submodules/CoreParse' (https://github.com/beelsebob/CoreParse) registered for path 'submodules/CoreParse'
Submodule 'submodules/Highlightr' (https://github.com/gnachman/Highlightr) registered for path 'submodules/Highlightr'
.......
Cloning into '/Users/jorelhan/Documents/CodeSpaces/OpenSource/iTerm2/submodules/Sparkle'...
Cloning into '/Users/jorelhan/Documents/CodeSpaces/OpenSource/iTerm2/submodules/SwiftyMarkdown'...
Cloning into '/Users/jorelhan/Documents/CodeSpaces/OpenSource/iTerm2/submodules/fmdb'...
# 此时出现错误,待执行完之后再次执行该命令直到没有任何输出为止
fatal: unable to access 'https://github.com/ccgus/fmdb/': LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
fatal: clone of 'https://github.com/ccgus/fmdb' into submodule path '/Users/jorelhan/Documents/CodeSpaces/OpenSource/iTerm2/submodules/fmdb' failed
Failed to clone 'submodules/fmdb'. Retry scheduled
Cloning into '/Users/jorelhan/Documents/CodeSpaces/OpenSource/iTerm2/submodules/iTerm2-shell-integration'...
Cloning into '/Users/jorelhan/Documents/CodeSpaces/OpenSource/iTerm2/submodules/libgit2'...
# 重复上个命令
[jorelhan@JorelMBP iTerm2]$ git submodule update --init --recursive
Cloning into '/Users/jorelhan/Documents/CodeSpaces/OpenSource/iTerm2/submodules/fmdb'...
Submodule path 'submodules/fmdb': checked out '2ca2cad644ae9d2bfc5584983b04807b09a443b2'
# 全部子项目克隆完成
[jorelhan@JorelMBP iTerm2]$ git submodule update --init --recursive
[jorelhan@JorelMBP iTerm2]$