Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以让Git知道现有的.gitmodules文件吗?_Git_Git Submodules - Fatal编程技术网

可以让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)