Git:将具有repo的目录转换为具有子模块的repo

Git:将具有repo的目录转换为具有子模块的repo,git,git-submodules,Git,Git Submodules,我正在“软件”目录中开发我的项目。项目分为以下子目录: software | +-- common_forms | +-- .git +-- common_utils | +-- .git +-- gui_app | +-- .git + ... ... and so on. 每个子目录都是一个git repo;主目录“软件”不是repo,只是repo的根目录 现在,我想将主目录“软件”转换为repo,并将这些存储库作为主repo的子

我正在“软件”目录中开发我的项目。项目分为以下子目录:

software
  |
  +-- common_forms
  |     +-- .git
  +-- common_utils
  |     +-- .git
  +-- gui_app
  |     +-- .git
  + ...
  ... and so on.
每个子目录都是一个git repo;主目录“软件”不是repo,只是repo的根目录


现在,我想将主目录“软件”转换为repo,并将这些存储库作为主repo的子模块。我怎样才能不破坏目录和回购协议的现有结构呢?

让我添加一个词,这是多余的,但在这里重点强调:

每个子目录已经是一个git回购;主目录“软件”不是repo,只是repo的根目录

在这种情况下,只需输入
软件
目录,运行
git init
以创建一个
.git
目录/存储库,并将其作为顶层工作树,并为每个不同的子模块使用
git submodule add
。有关git子模块添加的详细信息,请参见。然后
git添加
.gitmodules
文件并提交,以进行初始提交

请注意,每个
git子模块add
命令的repository参数可以与
path
参数相同。这会影响
.gitmodules
文件中的内容,一旦您在刚才创建的超级项目中进行了提交,该文件现在可用于此超级项目的未来克隆

也就是说,在将来,有人让我们给他或她一个名字,例如Pat将运行:

git clone $URL [<path>]
git clone$URL[]
从某个URL克隆子模块(目前我假设它位于
$URL
中,不过Pat可能会键入文本字符串而不是使用变量)。然后Pat将
cd
放入克隆并运行,例如,
git子模块更新--init

Pat在这里的克隆需要有关于
git子模块init
git子模块更新--init
的说明。这些说明告诉Git所有子模块都是什么,以及如何
Git克隆每个子模块。也就是说,Pat现在不必为每个子模块运行一个
git clone
,Pat的
git子模块更新--init
允许Pat的git从
.gitmodules
文件中读取这些
git clone
操作所需的URL和路径名

与路径相关的伪URL,如
/common\u forms
,会变成与URL相关的URL。也就是说,由于Pat克隆了
$URL
来创建超级项目,因此
.gitmodules
URL
/common_forms
将变成URL
${URL}/common_forms
。如果这是正确的URL,一切都很好

另一方面,假设您计划将超级项目推送到
host1.example.com/supers/superproj.git
,但所有子模块都将位于类似
host2.example.com/subs/common\u forms.git的URL上。然后,在创建
.gitmodules
文件时或提交之前,至少应该确保将存储在
.gitmodules
文件中的URL是
host2.example.com/subs/common_forms
host2.example.com/subs/common_forms.git
。这样Pat仍然能够运行
git子模块更新--init


(在可能的情况下,安排存储库宿主镜像超级项目和子模块布局是最有意义的,但这并不总是可能的。)

只需将cd放入软件,然后说git init?或看看@matt,在“git init”之后,所有子目录都会神奇地变成“软件”的子模块回购协议?你尝试的时候发生了什么?谢谢你的解释。在我的问题中,我忘了澄清,每个回购协议都已经有了相应的远程,传统上称为“来源”。我试图使用相对目录的路径添加子模块,但在远程repos的网站上,子模块的URL被破坏:链接导致404错误。然后我使用子项目repos的远程URL。在这种情况下一切正常。