git子模块的内容没有随基本仓库一起克隆。

3
我创建了一个仓库:
git init --bare myrepo.git

然后在同一台服务器上,为生产环境创建了仓库。

cd /home/myuser/public_html
git init
git remote add origin /usr/local/gitroot/myrepo.git
git commit --allow-empty -m "Initial commit"

然后创建子模块。
cd subdirectory
git init
git add .
git commit -m "Initial submodule commit"
cd ..
git submodule add /home/myuser/public_html/subdirectory subdirectory
git add .
git commit -m "Initial commit of base files and submodule"
git push origin master

然后在我的本地机器上

git clone --recursive ssh://user@mydomain/path/to/git mygitdirectory

在看起来像是干净的克隆版本的最后,我遇到了这个问题。
fatal: repository '/home/myuser/public_html/subdirectory' does not exist
Clone of '/home/myuser/public_html/subdirectory' into submodule path 'subdirectory' failed

尝试在子目录中使用git submodule add和git submodule update会得到相同的结果。我最终得到了所有基本文件,但是子目录为空。在服务器上,git log显示了基础文件+子模块的提交记录,并且基础和子模块的git状态都显示为“clean”。
附言:
我删除了所有内容,然后再次尝试将子模块创建更改为:
git submodule add ./subdirectory ./subdirectory

这导致了服务器上的一个 .gitmodules 文件

[submodule "subdirectory"]
path = subdirectory
url = ./subdirectory

在本地机器上进行克隆时,当到达子模块部分时会产生相同的错误。因此,我更改了.gitmodules文件(然后执行了git submodule sync),如下所示:
[submodule "subdirectory"]
path = subdirectory
url = ssh://user@mydomain/path/to/git

阅读(许多)不同的工作流建议,我发现自己不确定(a)每个.gitmodules文件应该包含哪些内容(我假设服务器上的那个是正确的),(b)将超级库推送到服务器上的裸仓库是否应该是唯一的裸仓库,还是子模块也需要一个(我认为一旦将子模块提交到超级库中,将超级库推送到裸仓库(origin)也会带上子模块历史记录),以及(c)本地子模块是否需要定义远程(在服务器上似乎没有出现这种情况,所以我在本地也没有这样做)。
1个回答

3

您本地的Git正在尝试使用最初从服务器克隆的本地路径作为其远程URL来克隆子模块,而这个路径在您的本地机器上不存在。

尝试通过SSH克隆子模块,这样它的远程URL将在服务器和您的本地机器上均可用。


我该怎么做?我尝试在.gitmodules文件中更改url到子模块的repo url + 相对路径,然后尝试仅使用repo url。两者都失败了。如果需要让git submodule更新不仅可以获取初始文件,还要能够保持同步前进,是吗? - JAyenGreen
我已经将.gitmodules中子模块的URL更改为SSH URL,并执行了git submodule sync。现在,当我执行gitmodule update时,不会出现“没有repo”的错误,而是出现“致命错误:引用不是树”的错误。 - JAyenGreen
我还没有遇到过这个特定的错误,几个小时后回家后我会尝试复制它。 - n.st
在上面添加了一段附言,详细说明了.gitmodules的内容以及我尝试过的其他方法。 - JAyenGreen
@Ayen,我成功让它工作了,但目前还有些混乱。Git似乎不喜欢将空仓库克隆为子模块。稍后我会尝试详细说明我所采取的步骤。 - n.st
显示剩余6条评论

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