我创建了一个回购:
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显示基本文件+子模块的提交,并且base和子模块中的git status显示为clean。
后记
我吹走了所有东西并再次尝试将子模块创建更改为:
git submodule add ./subdirectory ./subdirectory
在
的服务器上产生.gitmodules[submodule "subdirectory"]
path = subdirectory
url = ./subdirectory
在本地计算机上进行克隆时,它到达子模块部分时会导致相同的错误。所以,我将.gitmodules(然后执行git子模块同步)更改为:
[submodule "subdirectory"]
path = subdirectory
url = ssh://user@mydomain/path/to/git
阅读(很多)不同的工作流程建议,我发现自己不确定(a)每个.gitmodules的内容应该是什么(我假设服务器一个是正确的)(b)是否是超级回购的远程裸仓库推送服务器应该是唯一的裸仓库或子模块是否也需要一个(我假设一旦子模块在超级仓库中提交,将超级仓库推送到裸仓库(原点)也会获取子模块历史记录) ,以及(c)本地子模块是否需要远程定义(它似乎没有出现在服务器上,所以我当地没有这么做)
答案 0 :(得分:3)
您的本地git正在尝试使用您最初克隆它的远程URL克隆子模块 - 这是服务器上的本地路径,在本地计算机上不存在。
尝试通过SSH克隆子模块,因此其远程URL可以在服务器和本地计算机上运行。