如何在现有仓库中创建子模块

19

我是Git的新手,我的新项目有以下文件夹结构,于是我在Visual Studio中创建了一个空项目,它有如下文件夹结构:

project: (Repo) 
folder1 (sub1)
folder2 (sub2)

我在本地使用git。
我使用sourcetree为项目创建了一个仓库,
现在我无法添加任何子模块,我不知道为什么。

在powershell中,每当我尝试:

PS E:\Projects\Project> git submodule add ./sub1

我收到了以下错误信息:

sub1 already exists in the index

然后我决定使用git rm -r sub1删除sub1,并重新添加它,但当我尝试再次使用git submodule add添加它时,我收到了这个新错误:

sub1 already exists and is not a valid git repo

那么我做错了什么?


我已经看过了,在我发布这个主题之前,我使用了git rm -r,但在使用后,它显示了新的错误,如我的主题所述。 - ma1169
你使用过 --cached 吗? - Basilevs
是的,问题是我在将子模块添加为子模块之前应该先将它创建为git存储库。我以为添加子模块会自动创建git存储库,但当我创建新项目时,问题就解决了。 - ma1169
2个回答

25

您只需要进入根目录,然后添加子模块文件夹。

git submodule add <url>

现在当你克隆项目时,只需要初始化并更新子模块即可。

git submodule init
git submodule update

Git 1.8.2 推出了一项新功能:--remote 选项。

git submodule update --remote --merge

将会获取每个子模块中来自上游最新的更改,合并它们,并检出子模块的最新修订版本。就像[文档][1]所说的那样:

--remote

此选项仅适用于更新命令。不使用超级项目记录的SHA-1来更新子模块,而是使用子模块远程跟踪分支的状态。

这相当于在每个子模块中运行git pull。


1
我是说使用 git submodule add <url> 会导致我提到的错误,谢谢。 - ma1169
1
你也可以直接使用 git clone --recursive 命令代替 git submodule initgit submodule update 命令。 - quine

22
添加子模块意味着在现有的Git存储库中克隆另一个Git存储库并保留对其的引用。
在您的情况下,您没有指定要添加的存储库:
git submodule add -- /url/of/sub1/repo sub1
如果sub1sub2不应该是自己的 git 子仓库,而只是主仓库文件夹下的简单子文件夹,则不需要使用git submodule add命令。
只需在 sub1sub2 中添加文件,然后就可以使用 git addgit commit了。
不会涉及到子模块。

1
它们应该是两个不同的Git仓库。 - ma1169
@ma1169 那么我的答案的第一部分依然适用。你需要为那些子文件夹创建远程仓库。 - VonC
能否解释一下这段 /url/if/sub1/repo sub1 的意思?所以 URL 是目录位置吗? 那么 /if/ 是什么?应该不是 url/if/repo/sub1 sub1 吗? - ma1169
@ma1169 我的意思是 /of/ 而不是 /if/。你需要一个远程 URL 来克隆到 sub1。这就是 /url/of/sub1/repo 的含义。例如:https://github.com/<user>/<arepo> - VonC
@VonC 如果 sub1 已经存在怎么办?因为我的 Docker 文件在 sub1 目录中。 - Dr. Mian
@MianAsbatAhmad 最好提出一个单独的问题,以更好地了解您的具体问题。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接