【问题标题】:Is it possible to make Git aware of an existing .gitmodules file?是否可以让 Git 知道现有的 .gitmodules 文件?
【发布时间】:2011-11-29 14:21:40
【问题描述】:

我添加了一个子模块:

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 git-submodules


【解决方案1】:

好的,多亏了亚当,我找到了答案,这很明显,但还是在这里:

如果您检查 git submodule add 做了什么,您会注意到它做了三件事:

  1. 将行添加到.gitmodules 文件中,
  2. 将 repo 克隆到您在命令中确定的“路径”中,然后
  3. 将模块添加到.git/config 文件中。

因此,基本上手动添加子模块的 repo 与通过 git submodule 命令添加的 repo 之间的唯一区别是 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 文件中使用的“路径”变量在该文件中不需要

【讨论】:

  • 这不能正常工作。它的作用是添加存储库不是作为子模块,而是作为主存储库代码的一部分。执行git clone,即使您在外部存储库中克隆,也会正常克隆它。添加后显示代码通常作为子模块添加。或者我在这里错过了什么?
  • @Andrius 是的,我认为实际上 Pablo 错过了一些东西。他没有显示对.gitmodules 文件的必要编辑。子模块需要在.git/config和.gitmodules这两个文件中指定(如原题第二个代码块所示)。
【解决方案2】:

你需要跑

git submodule update --init --recursive 

更新:

submodule add 命令实际上是克隆整个 repo 并将 sha1 添加到索引中。

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

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

希望这会有所帮助。

【讨论】:

  • 那不行……还是检测不到手工子模块。
  • 你是否在repo中添加了一个名为 rack 的空白目录?
  • 不...不需要。它们是自动创建的。这里的问题是 git submodule 仅检测通过 git submodule add 添加的模块,而不是直接添加到文件中的模块。此外,看起来 --recursive 选项与真正不同的东西有关。可能是我解释的不够清楚?
  • git 不会在 repo 文件夹之外存储任何内容。克隆 repo,然后做一个目录差异。您可能会看到创建了空目录而没有创建。请在此处发布差异输出,以便人们可以帮助您。
  • 我要说的是,通过制作 repo 的副本,您自己看看有什么不同,一种是手动完成,另一种是通过命令完成。现在运行类似 windiff 的东西来查看 2 in 结构和任何文件内容之间的区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 2017-09-04
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
相关资源
最近更新 更多