自动添加 git 子模块 (.gitmodules)

Syn*_*xis 11 git git-submodules

我有一个包含几个子模块的仓库。我想添加一些其他的,对我来说最快的方法是使用.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)
Run Code Online (Sandbox Code Playgroud)

Tom*_*uer 5

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

[submodule "git-submodule"]
    path = git-submodule
    url = https://github.com/TomasHubelbauer/git-submodule
Run Code Online (Sandbox Code Playgroud)

将其添加到.git/config该文件中现有内容之后。

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

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

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

因此,我认为手动添加 Git 子模块不太现实。

  • 啊,原来如此,我理解错了。我也希望如此! (3认同)

Cod*_*ard 2

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

但是,除非您确切知道自己要做什么,否则最好使用 CLI 命令,因为可能有一些您不熟悉的内容,例如:

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

git submodule init
git submodule update
Run Code Online (Sandbox Code Playgroud)

手动添加将不起作用。

运行添加子模块并观察.git文件夹更改。您将看到一个以您的子模块名称命名的新文件夹module

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

  • 好吧,我的问题不是使用命令行添加。我想要的是 `git submodule init` 自动添加 gitmodules 中存在的非暂存模块。即,gitmodules 文件规定了 git 如何管理子模块(而不是相反)。是否可以 ? (3认同)