【问题标题】:Adding git submodules automatically (.gitmodules)自动添加 git 子模块 (.gitmodules)
【发布时间】:2014-07-16 10:05:14
【问题描述】:

我有一个包含几个子模块的仓库。我想添加一些其他的,对我来说最快的方法是使用.gitmodules(在我看来,这显然应该允许任何类型的子模块管理)。

但是,在编辑此文件并添加子模块时,在 git submodule init 之后不会添加任何内容(修改之前已经存在的子模块除外)。

是否有任何解决方案可以在不经过git submodule add 的情况下添加子模块(即,只需编辑.gitmodules 文件,然后编辑git submodule update --init)?

也就是说,下面的工作流程应该自动添加子模块“foo/bar”:

Add the following to .gitmodules:
    [submodule "foo/bar"]
        path = foo/bar
        url = https://example.com/foo.git

Run the following command after saving:
    git submodule init
    git submodule update

Expected result:
    submodule 'foo/bar' automatically gets added
    it is also updated (the update command)

【问题讨论】:

  • 当您编写 git submodule add 时,只需将新条目添加到 .submodules 文件中,因此您所描述的内容是正确的,它应该适合您。这就是为什么在 add 之后你必须运行 init & update
  • 不使用git submodule add 导致模块没有为我添加(遗憾)......当你考虑它时,git 能够跟踪大量文件中的数千个修改,但完全在.gitmodules 中添加 3 行时丢失了...
  • 我已经根据您的更新更新了我的答案,除非您知道如何在.git 文件夹下创建模块目录,否则您无法手动执行。
  • 执行此命令并查看结果GIT_TRACE=2 git submodule add git@github.com....

标签: git git-submodules


【解决方案1】:

当您添加 Git 子模块时,Git 会创建 .gitmodules 文件,并且会为名为 git-submodule 的子模块添加如下内容:

[submodule "git-submodule"]
    path = git-submodule
    url = https://github.com/TomasHubelbauer/git-submodule

.git/config 文件中的现有内容之后添加相同内容。

.git/modules 中创建以子模块命名的子模块文件夹。 该文件夹与实际子模块存储库的.git 目录几乎相同,但它不包含实际的objects(相反,子模块数据被检出到其目录并且其元数据位于此处)。

这意味着理论上,您可以在不使用git submodule add 的情况下手动添加子模块,但您必须重新创建所有这些配置文件。 但是人们仍然可以想象将子模块存储库克隆到一个单独的目录并将其.git 复制到这个目录。这可能有效。

但是,添加子模块也会更改索引 .git/index,因此您还必须手动更新此哈希,此时,您正在重新实现 Git,但需要手动执行。

因此,我认为手动添加 Git 子模块几乎不可行。

【讨论】:

  • 感谢您的回答。问题不是关于如何手动添加子模块,而是关于如何使 .gitmodule 文件成为子模块配置的 master,即编辑它并输入 git submodule update调整回购。显然,这是不可能的:(
  • 啊,我明白了,我误解了。我也希望是这样!
【解决方案2】:

是的,正如你所描述的,一旦你添加了子模块,它就会被添加到你的 .gitsubmodule 文件中。

但除非您确切知道自己在做什么,否则使用 CLI 命令会更好,因为可能有一些您不熟悉的东西,例如:

编辑完子模块文件后,您需要运行:

git submodule init
git submodule update

手动添加将不起作用。

运行添加子模块并观察.git 文件夹的变化。您将看到一个名为 module 的新文件夹,其中包含您的子模块名称。

这就是为什么您不应该手动执行此操作的原因。

【讨论】:

  • 好吧,我的问题不是使用命令行添加。我想要的是git submodule init 自动添加 gitmodules 中存在的非暂存模块。即, gitmodules 文件规定了 git 如何管理子模块(而不是相反)。有可能吗?
猜你喜欢
  • 2012-06-30
  • 2013-06-30
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 2011-06-03
  • 2015-08-16
相关资源
最近更新 更多