Git子模块:将子模块移动到仓库之外

15
创建一个 Git 子模块,只需输入以下命令:
git submodule add <repo> && git submodule init

我的 .git/config 文件被修改了,并且创建了一个新的文件 .gitmodules。看起来我可以将子模块移动到特定的文件夹中,无论是在还是在仓库外:

$ cat gitmodules

[submodule "sub_repo"]
path = sub_repo
url = <...>

但是当我试图将我的存储库移动到上一级文件夹并更改我的.gitmodules时。
path = ../sub_repo

在 'git update' 或 'git submodule foreach' 上似乎忽略了该模块。

我的推理错误在哪里?

非常感谢!

2个回答

10

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

  1. 从仓库开始,假设子模块在 my-submodule/ 目录下:

    mv my-submodule ../
    
  2. 删除子模块中的指向.git文件(请注意它不是目录):

  3. rm ../my-submodule/.git
    
  4. 将子模块的真实 git 元数据移动到子模块的 git 仓库中:

  5. mv .git/modules/my-submodule/ ../my-submodule/.git
    
  6. 通过删除先前在仓库内指向相对路径的worktree参数,编辑.git/config文件。

就这样了!此时,您的父级仓库将显示子模块为deleted,而子模块本身将正常工作(可能会出现分离的HEAD,您可以将其重置为主分支)。

也可以编辑父级仓库中的.gitmodules文件,但是我发现如果提交了已删除的子模块,则不进行此操作不会破坏任何内容。

如果有人知道更快的方法(例如实际的git命令),我将非常乐意听取建议。


谢谢,这个很好用!后来我按照John Douthat在这里的回答(https://dev59.com/QHM_5IYBdhLWcg3wt1k0)从原始repo中删除了子模块。 - pedrovgp

7

这仅仅是不被支持,就是这样。子模块的整个意义在于将一个存储库放到另一个存储库中。

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


6
我看不出其中一个可以理解的原因。我想把我的当前项目状态参照外部仓库的状态。我不需要它存在于我的代码库中。无论如何,也许将来会支持这个功能。 - John Rumpel
@JohnRumpel:可能不行。Git只在其存储库文件夹内进行写入,因此无法在克隆上创建该子模块。 - Daniel Hilgarth
2
所以我必须编写自己的分支。flexibleGit ;-) - John Rumpel
7
当Dependency1和Dependency2已经将Dependency3作为子模块自身包含时,似乎不能使用子模块来包含Dependency1、Dependency2和Dependency3。 - Roman Starkov
让我感到惊讶的是,有人会使用子模块,这迫使任何克隆他们存储库的人在使用它进行其他任何操作时都必须保留该子模块的多个副本。这是一个极其糟糕的设计想法。 - Chuckk Hubbard
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接