'git submodule init'有什么意义?

背景

要填充存储库的子模块,通常需要调用:

git submodule init
git submodule update

在这个用法中, git submodule init似乎只做了一件事:使用.gitmodules信息填充.git/config

那是什么意思?

无法git submodule update只是使用.gitmodules的信息? 这将避免两个:

  • 一个不必要的命令( git submodule init ); 和
  • 一个不必要的数据重复( .gitmodules内容到.git/config )。
  • 或者:

  • 有一些我不知道的git submodule init用例(在这种情况下,请赐教!); 要不然
  • git submodule init是cruft,可以在Git中弃用而没有任何伤害。
  • 其中哪些是真的?


    假设存储库有10个子模块,并且您只对这些子模块感兴趣。 在这种情况下,您可能需要不时从远程存储库仅更新这两个子模块。 git init对此很好,因为一旦你为这两git submodule update --remote模块执行git init命令, git submodule update --remote只适用于它们。

    如果有人喜欢我的回答,请用英文纠正我的错误。


    附加了两个工作流程演示。

    工作流程1:子模块是多个项目使用的libralies。

    我认为这是常见的用例之一。

    你只需克隆“我的项目”。

    git clone https://example.com/demo/my-project  
    

    其结构表面如下图所示。

    .gitmodules的内容

    [submodule "lib1"]
        path = lib1
        url = https://example.com/demo/lib1
    [submodule "lib2"]
        path = lib2
        url = https://example.com/demo/lib2
    [submodule "lib3"]
        path = lib3
        url = https://example.com/demo/lib3
    [submodule "lib4"]
        path = lib4
        url = https://example.com/demo/lib4
    

    你想重构引用lib1和lib2的代码code1.js ,这意味着你不需要克隆和签出lib3和lib4。 所以你只需运行下面的命令。

    git submodule init lib1 lib2
    

    现在我们来看看.git/config的内容

    ...
    [submodule "lib1"]
        active = true
        url = https://example.com/demo/lib1
    [submodule "lib2"]
        active = true
        url = https://example.com/demo/lib2
    

    这意味着像“准备从example.com/demo更新lib1和lib2”。
    在这个时候,lib1和lib2目录是空的。
    您可以通过一个命令来克隆和检出lib1和lib2。

    git submodule update
    

    现在,您可以重构code1.js而无需导入错误。
    子模块只是对某些提交的引用。 所以当你想更新库到新版本时,你必须更新引用。 你可以通过下面的命令来完成。

    git submodule update --remote
    

    现在你看到只初始化你需要的子模块是多么有用。

    工作流程2:每个子模块都是一个项目,一个大型项目包含它们。

    我是这个的粉丝。

    你克隆“主项目”。

    git clone https://example.com/demo/main-project  
    

    其结构表面如下图所示。

    你可以看到一个名为“shared”的目录。 此工作流程中有一条规则:如果要在项目中使用主项目的共享代码,则必须将该项目创建为主项目的子模块。
    我喜欢将实体类放在如下所示的共享目录中。

    回到子模块工作流程,.gitmodules的内容如下所示。

    [submodule "sub-project1"]
        path = sub-project1
        url = https://example.com/demo/sub-project1
    [submodule "sub-project2"]
        path = sub-project2
        url = https://example.com/demo/sub-project2
    [submodule "sub-project3"]
        path = sub-project3
        url = https://example.com/demo/sub-project3
    [submodule "sub-project4"]
        path = sub-project4
        url = https://example.com/demo/sub-project4
    

    这次您想重构main-project的共享目录中的一些代码,并且您知道只有sub-project1和sub-project2引用了共享代码,这意味着您不需要克隆和签出sub-project3和sub-project4。 所以你只需运行下面的命令。

    git submodule init sub-project1 sub-project2
    

    就像我在workflow1中提到的那样,您需要运行以下命令来克隆和检出它们。

    git submodule update
    

    在这种情况下,我什么时候可以进行git submodule update --remote ? 或者甚至是否必须初始化并更新子模块以重构共享目录中的代码? 是。 因为必须在重构共享代码之后在子模块中运行测试,并且在重构时将子模块的任何更新提交并推送到远程存储库,则需要通过git submodule update --remote获取它们。

    如果有人喜欢我的回答,请用英文纠正我的错误。


    阅读git submodule文档,有一个用例,表面上证明了git submodule init作为独立命令的存在。

    如果克隆存储库的用户希望为子模块使用不同于上游存储库指定的URL,则该用户可以:

    git submodule init
    vim .git/config # Alter submodule URL as desired, without changing .gitmodules
                    # or polluting history.
    git submodule update
    
    链接地址: http://www.djcxy.com/p/92409.html

    上一篇: What is the point of 'git submodule init'?

    下一篇: forgot to use