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。在这种情况下一切正常。