我添加了一个子模块:
git submodule add git://github.com/chneukirchen/rack.git rack
创建了一个文件.gitmodules
,如:
[submodule "rack"]
path = rack
url = git://github.com/chneukirchen/rack.git
当然Git知道这件事:
git submodule status
30fb044db6ba5ea874ebc44a43bbd80a42676405 rack (1.3.0-64-g30fb044)
我手动添加了一个子模块,例如,添加到该文件:
[submodule "redcloth"]
path = plugins/redcloth
url = git://github.com/jgarber/redcloth.git
我重复了上一个命令:
git submodule init
Submodule 'rack' () registered for path 'rack'
git submodule update
(no output)
git submodule status
30fb044db6ba5ea874ebc44a43bbd80a42676405 rack (1.3.0-64-g30fb044)
所以,据我所知,我手工添加的内容被忽略了。有没有办法让Git知道.gitmodules文件中手工添加的行?
注意:我还尝试手动将这些行添加到.git/config
文件中,但这也不起作用。
答案 0 :(得分:18)
好的,非常感谢Adam,我找到了答案,有点显而易见,但是,这里是:
如果你检查git submodule add
做了什么,你会注意到它做了三件事:
.gitmodules
文件.git/config
文件。因此,基本上手动添加子模块的repo和通过git submodule
命令添加的子模块之间的唯一区别是repo本身的内容。
回答相同的例子,你应该:
$ git clone git://github.com/jgarber/redcloth.git plugins/redcloth
将以下内容添加到.git/config
文件*:
[submodule "redcloth"]
url = git://github.com/jgarber/redcloth.git
确保至少将它们添加到git repo:
$ git add plugins/redcloth
然后检查git是否真的“知道”:
$ git submodule status
0766810ab46f1ed12817c48746e867775609bde8 plugins/redcloth (v4.2.8)
30fb044db6ba5ea874ebc44a43bbd80a42676405 rack (1.3.0-64-g30fb044)
*请注意,该文件中不需要.gitmodules
文件中使用的“路径”变量
答案 1 :(得分:4)
你需要运行
git submodule update --init --recursive
更新:
submodule add命令实际克隆整个repo并将sha1添加到索引中。
与以前版本的git相比,这可能是新行为,克隆并未立即完成。
如果索引中没有条目将模块指向特定的提交,则git子模块更新拒绝执行任何操作。这似乎是新的行为。
希望这有帮助。