如何解决Git:将带有 repos 的目录转换为带有子模块的 repo
我正在“软件”目录中开发我的项目。项目分为子目录:
software
|
+-- common_forms
| +-- .git
+-- common_utils
| +-- .git
+-- gui_app
| +-- .git
+ ...
... and so on.
每个子目录都是一个git repo;主目录“软件”不是存储库,只是存储库的根目录。
现在我想把主目录“软件”变成一个仓库,并将这些仓库作为主仓库的子模块。如何做到不破坏目录和存储库的现有结构?
解决方法
让我在这里添加一个词——有点多余,但对于强调很重要——
每个子目录已经是一个git仓库;主目录“软件”不是存储库,只是存储库的根目录。
在这种情况下,只需进入 software
目录,运行 git init
以创建一个 .git
目录/存储库,以此作为其顶级工作树,并使用 git submodule add
对于每个不同的子模块。有关 git submodule add
的详细信息,请参阅 the git submodule
documentation。然后git add
.gitmodules
文件并提交,以进行初始提交。
请注意,每个 git submodule add
命令的 repository 参数可以与 path
参数相同。这会影响 .gitmodules
文件中的内容,一旦您在刚刚创建的超级项目中进行提交,该文件现在可用于该超级项目的未来克隆。
也就是说,将来有人——让我们给他或她起个名字,例如 Pat——会跑:
git clone $URL [<path>]
从某个 URL 克隆子模块(现在我假设它在 $URL
中,尽管 Pat 可能会输入文字字符串而不是使用变量)。然后 Pat 将 cd
进入克隆并运行,例如 git submodule update --init
。
Pat 在此处的克隆需要有 git submodule init
或 git submodule update --init
的说明。这些说明告诉 Git 所有子模块是什么以及如何git clone
每个子模块。也就是说,现在 Pat 不必为每个子模块运行一个 git clone
,Pat 的 git submodule update --init
允许 Pat 的 Git 从 .gitmodules
文件中读取所需的 URL 和路径名每个这些 git clone
操作。
路径相关的伪 URL,例如 ./common_forms
,会变成 URL 相关的 URL。也就是说,由于 Pat 克隆了 $URL
来制作超级项目,.gitmodules
URL ./common_forms
变成了 URL ${URL}/common_forms
。如果这是正确的网址,则一切正常。
另一方面,假设您计划将超级项目推送到 host1.example.com/supers/superproj.git
,但所有子模块都将位于 host2.example.com/subs/common_forms.git
之类的 URL 中。然后,当您创建 .gitmodules
文件时(或至少在提交它之前),您应该确保将存储在 .gitmodules
文件中的 URL 是 {{1 }} 或 host2.example.com/subs/common_forms
。这样 Pat 仍然可以运行 host2.example.com/subs/common_forms.git
。
(在可能的情况下,安排托管存储库以镜像超级项目和子模块布局是最有意义的,但并非总是可行。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。