我在项目中创建子模块时遇到问题。如果我直接在存储库根目录中创建子模块,一切正常。如果子模块更深,则不会克隆存储库。
例如,这可以按预期工作:
git submodule add git://someproject.com/.git someproject
但是,当我运行以下命令时,项目将添加到.gitmodules
并创建一个空存储库,但不会删除任何代码(即使在{{1}之后})。该命令不会产生任何输出。
git submodule update --init
答案 0 :(得分:3)
尝试运行
git submodule init
git submodule update
添加子模块后。
更新1
试试这个:
cd lib/someproject
git status
您应该看到# Not currently on any branch.
如果没有,那么就没有git repo存在,你可能偶然发现了一个git bug,如果你看到上面的消息,请执行以下操作:
git checkout master
git pull
答案 1 :(得分:2)
您需要运行以下命令
git submodule update --init lib/someproject
由于某种原因,git只在子模块中运行和更新时查找根目录,而不是通过整个工作副本。
还要确保您的.gitmodules
文件包含以下条目:
[submodule "someproject"]
path = lib/someproject
url = git://someproject.com/.git
您的.git/config
文件包含:
[submodule "someproject"]
url = git://someproject.com/.git
文档:
答案 2 :(得分:2)
以前尝试添加子模块似乎使我的存储库处于错误状态。执行这些步骤后,我能够正确克隆子模块:
rm -rf lib/someproject
.gitmodules
文件.git/config
文件.git/modules/someproject
然后再次运行git add submodule
命令。非常感谢所有那些把我推向正确方向的回答者!
答案 3 :(得分:0)
我刚刚阅读了O'Reilly书中的子模块部分,作者在添加子模块时提到了(在他的示例中,手动将git add添加到项目根目录中的克隆存储库中),其中包括尾部斜杠导致它将文件夹添加到索引与创建gitlink。这听起来很愚蠢,但可能会在添加之前尝试将目录更改为lib,以确保由于您的子模块路径中的斜杠而不会发生这种情况。
这也可能是“子模块添加”的一个特点,它只接收路径和远程URL,并在写入配置时从路径中推断出子模块名称。也许手动编辑gitmodules和config条目以确保子模块的命名没有'lib /',但路径包含它。
答案 4 :(得分:0)
我必须删除.gitmodules
的内容,并使用--force
选项再次添加子模块,例如git submodule --force add git://someproject.com/.git
。另外,由于我正在使用Dockerfile安装.gitmodules的特定子模块,因此我也在那里强制进行了更新RUN git submodule update --init -f someproject
。但是,我认为强制添加再次解决了该问题。