如何使用子模块克隆本地存储库?

Woo*_*low 7 git git-clone git-submodules

假设我递归地克隆一个存储库。

$ git clone --recursive ssh://server/project/client
Cloning into 'client'...
remote: Counting objects: 191, done
remote: Finding sources: 100% (191/191)
remote: Total 191 (delta 53), reused 159 (delta 53)
Receiving objects: 100% (191/191), 27.59 KiB | 0 bytes/s, done.
Resolving deltas: 100% (53/53), done.
Checking connectivity... done.
Submodule 'gui' (ssh://server/project/client/gui.git) registered for path 'gui'
Cloning into 'gui'...
remote: Counting objects: 3213, done
remote: Finding sources: 100% (3213/3213)
remote: Total 3213 (delta 1272), reused 3107 (delta 1272)
Receiving objects: 100% (3213/3213), 47.88 MiB | 12.05 MiB/s, done.
Resolving deltas: 100% (1272/1272), done.
Checking connectivity... done.
Submodule path 'gui': checked out '7315db8d7a8b36929f7874dc5477359839ec51ce'
Run Code Online (Sandbox Code Playgroud)

现在我想创建该本地存储库的本地克隆(可能在本地进行并提交更改之后)。

$ git clone --recursive client/ client_copy
Cloning into 'client_copy'...
done.
Submodule 'gui' (/home/deployer/client/gui.git) registered for path 'gui'
fatal: repository '/home/deployer/client/gui.git' does not exist
Clone of '/home/deployer/client/gui.git' into submodule path 'gui' failed
Run Code Online (Sandbox Code Playgroud)

我的.gitmodules文件如下所示:

[submodule "gui"]
        path = gui
        url = ../client/gui.git
Run Code Online (Sandbox Code Playgroud)

为什么会失败?我该如何解决这个问题?

小智 6

问题出在你的.gitmodules文件上。项目中的子模块url被定义为超级项目存储库的相对路径,但是当克隆子模块时,它们将使用该path位置放置。

换句话说,git 试图从该url位置拉出子模块,但在您的本地计算机上,它们实际上位于该path位置。

要解决此问题,只需克隆本地超级项目存储库 ( git clone /path/to/superproject),然后进入新克隆.gitsubmodules并将urls 更改为./<whatever-the-path-is>。例如,您的 gui 子模块将变为:

[submodule "gui"]
        path = gui
        url = ./gui
Run Code Online (Sandbox Code Playgroud)

将每个子模块更改为.gitmodules如下所示,然后运行:

git submodule sync
git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)

那应该可以了!