Git子模块:将子模块移出存储库

Joh*_*pel 5 git git-submodules

通过键入创建git子模块后

git submodule add <repo> && git submodule init
Run Code Online (Sandbox Code Playgroud)

我的.git / config已更改,并创建了一个新文件.gitmodules。看来我可以将子模块移动到存储库内以及存储库外的特定文件夹中:

$ cat gitmodules

[submodule "sub_repo"]
path = sub_repo
url = <...>
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将存储库移至父文件夹并更改.gitmodules时

path = ../sub_repo
Run Code Online (Sandbox Code Playgroud)

似乎忽略了'git update'或'git submodule foreach'上的那个模块。

我在这里推理的错误是什么?

非常感谢!

And*_*Mao 7

将子模块从其父 repo 移到独立目录中只需更新一些元数据。使用 Git 2.4,步骤如下:

  1. 从 repo 开始,假设子模块在my-submodule/

    mv my-submodule ../
    
    Run Code Online (Sandbox Code Playgroud)
  2. 删除.git子模块中的指针文件(注意不是目录):

    rm ../my-submodule/.git
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将子模块的真实 git 元数据移动到子模块的 git 存储库中:

    mv .git/modules/my-submodule/ ../my-submodule/.git
    
    Run Code Online (Sandbox Code Playgroud)
  4. .git/config通过删除worktree先前指向存储库内的相对路径的参数来编辑文件。

就是这样!此时,您的父存储库会将子模块显示为deleted,而子模块本身将正常工作(可能带有分离的 HEAD,您可以将其重置为 master)。

也可以.gitmodules在父存储库中编辑文件,但我发现不这样做不会破坏任何内容,只要您提交已删除的子模块。

如果其他人知道这样做的更快方法(例如实际的 git 命令),我会全神贯注。


Dan*_*rth 5

只是不支持,仅此而已。子模块的全部意义基本上是在另一个存储库中拥有一个存储库。

如果您不想这样做,请不要使用子模块。只需克隆其他存储库。

  • 当 Dependency1 和 Dependency3 都已经将 Dependency3 作为子模块时,它似乎确实排除了使用子模块来包含 Dependency1、Dependency2 和 Dependency3 的可能性... (5认同)
  • 我看不出有什么可以理解的理由。我想将我当前的项目状态引用到外部存储库的状态。我的存储库中不需要它。无论如何。以后应该会支持的 (4认同)
  • 所以我必须写我自己的fork。灵活的Git;-) (2认同)