关于git子模块:是否可以让Git知道现有的.gitmodules文件?

Is it possible to make Git aware of an existing .gitmodules file?

我添加了一个子模块:

1
git submodule add git://github.com/chneukirchen/rack.git rack

文件.gitmodules创建如下:

1
2
3
[submodule"rack"]
path = rack
url = git://github.com/chneukirchen/rack.git

当然,Git知道:

1
2
git submodule status
30fb044db6ba5ea874ebc44a43bbd80a42676405 rack (1.3.0-64-g30fb044)

我手工添加了一个子模块,例如,添加到该文件:

1
2
3
[submodule"redcloth"]
path = plugins/redcloth
url = git://github.com/jgarber/redcloth.git

我重复了前面的命令:

1
2
3
4
5
6
7
8
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 add的功能,你会发现它有三个功能:

  • 将行添加到.gitmodules文件中,
  • 克隆您在命令中确定的"路径"中的repo,以及
  • 将模块添加到.git/config文件中。
  • 因此,手工添加子模块的回购与通过git submodule命令添加子模块的回购的唯一区别就是回购本身的内容。

    用同样的例子回答,您应该:

    1
    $ git clone git://github.com/jgarber/redcloth.git plugins/redcloth

    将以下内容添加到.git/config文件*:

    1
    2
    [submodule"redcloth"]
    url = git://github.com/jgarber/redcloth.git

    确保至少将它们添加到git repo中:

    1
    $ git add plugins/redcloth

    然后检查Git是否"知道":

    1
    2
    3
    $ git submodule status
    0766810ab46f1ed12817c48746e867775609bde8 plugins/redcloth (v4.2.8)
    30fb044db6ba5ea874ebc44a43bbd80a42676405 rack (1.3.0-64-g30fb044)

    *请注意,该文件中不需要您在.gitmodules文件中使用的"path"变量。


    你需要跑步

    1
    git submodule update --init --recursive

    更新:

    子模块add命令实际上克隆了整个repo并将sha1添加到索引中。

    这可能是新的行为,与以前的Git版本相比,克隆没有立即完成。

    如果索引中没有将模块指向特定提交的条目,那么git子模块更新将拒绝执行任何操作。这似乎是一种新的行为。

    希望这有帮助。