我在项目中创建子模块时遇到了一个问题,如果我直接在版本库根目录下创建子模块,一切正常。如果我直接在版本库根目录下创建子模块,一切正常。如果子模块再深一点,版本库就不会被克隆。
例如,这可以按照预期工作。
git submodule add git://someproject.com/.git someproject
然而,当我运行下面的命令时,项目被添加到... .gitmodules
和一个 虚空 仓库被创建,但没有任何代码被拉下(即使在一个 git submodule update --init
). 该命令不产生任何输出。
git submodule add git://someproject.com/.git lib/someproject
尝试运行
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
你需要运行以下命令
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
文档。
看来之前添加子模块的尝试让我的版本库处于不良状态。在执行这些步骤后,我能够正确地克隆子模块。
rm -rf lib/someproject
.gitmodules
档案.git/config
档案.git/modules/someproject
然后运行 git add submodule
指挥再次奏效。非常感谢所有的回答者,他们把我推到了正确的方向!
我刚刚读完O'Reilly书中的子模块部分,作者提到当添加一个子模块时(在他的例子中,手动使用git add到项目根部的克隆repo),包括尾部的斜杠会导致它将文件夹添加到索引中,而不是创建一个git链接。这听起来很傻,但也许可以尝试在添加之前将目录改为lib,以确保这种情况不会发生在你身上,因为你的子模块路径中的斜杠。
这也可能是 "submodule add "只接收路径和远程url的特殊性,并在写入configs时从路径中推断出子模块名称。 也许可以手动编辑gitmodules和config条目,以确保子模块的名字中没有'lib',但路径中包含它。
我不得不删除 .gitmodules
并再次添加子模块,用 --force
选项,例如: . git submodule --force add git://someproject.com/.git
. 此外,由于我使用Docker文件来安装一个特定的.gitmodules子模块,我也在那里强制更新了 RUN git submodule update --init -f someproject
. 不过,我觉得强行添加又解决了这个问题。