可以让Git知道现有的.gitmodules文件吗?
我添加了一个子模块:可以让Git知道现有的.gitmodules文件吗?,git,git-submodules,Git,Git Submodules,我添加了一个子模块: 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
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
文件中,但也没有成功。您需要运行
git submodule update --init --recursive
更新:
子模块add命令实际上克隆了整个repo,并将sha1添加到索引中
与以前版本的git相比,这可能是一种新的行为,克隆没有立即完成
如果索引中没有将模块指向特定提交的条目,git子模块更新将拒绝执行任何操作。这似乎是一种新的行为
希望这能有所帮助。好吧,多亏了亚当,我找到了答案,答案是显而易见的,不过,答案是: 如果您检查git submodule add的功能,您会注意到它有三个功能:
.gitmodules
文件中.git/config
文件中git submodule
命令添加子模块的回购之间的唯一区别是回购本身的内容
用同样的例子回答,你应该:
$ git clone git://github.com/jgarber/redcloth.git plugins/redcloth
将以下内容添加到.git/config
文件*:
[submodule "redcloth"]
url = git://github.com/jgarber/redcloth.git
确保至少将它们添加到git回购中:
$ git add plugins/redcloth
然后检查git是否真的“感知”:
*请注意,您在
.gitmodules
文件中使用的“path”变量在该文件中不需要您是否尝试过运行git submodule init
和git submodule update
?是的,我尝试过;什么也没发生。我将在问题中指出这一点。请看以下答案:这不起作用。。。它仍然没有检测到手工制作的子模块。您是否在repo中添加了一个名为rack的空白目录?没有。。。不需要。它们是自动创建的。这里的问题是git子模块只检测通过git子模块add添加的模块,而不是直接添加到文件中的模块。而且,看起来是这样的——递归选项与真正不同的东西有关。也许我解释得不够好?git在repo文件夹之外不存储任何东西。克隆repo,然后执行目录差异。您可能会看到空dir已生成,但尚未生成。请将差异输出张贴在这里,以便人们能够帮助您。我所说的是,通过制作回购协议副本,一个是手工完成,另一个是通过命令完成,自己看看差异是什么。现在运行windiff之类的程序,查看结构中的2与任何文件内容之间的差异。这无法正常工作。它所做的不是将存储库作为子模块添加,而是作为主存储库代码的一部分添加。执行git克隆时,即使您在外部存储库中进行克隆,也会正常克隆它。添加后,它会显示正常添加的代码,而不是子模块。或者我错过了什么?@Andrius是的,我想实际上巴勃罗错过了什么。他没有显示对.gitmodules
文件的必要编辑。需要在.git/config
和.gitmodules
文件中指定子模块(如原始问题的第二个代码块所示)。
$ git submodule status
0766810ab46f1ed12817c48746e867775609bde8 plugins/redcloth (v4.2.8)
30fb044db6ba5ea874ebc44a43bbd80a42676405 rack (1.3.0-64-g30fb044)