我有多个存储库,我想将它们整合到一个名为Z的存储库中。因此,如果我有存储库A、B和C,我想以Z/A、Z/B和Z/C结束。换句话说,每个存储库都将成为一个存储库Z中的一个文件夹
我方法是:克隆Z,将目录更改到其中并克隆其他目录,但当我尝试add
时,我得到了以下内容:
warning: adding embedded git repository: A
hint: You've added another git repository inside your current repository.
hint: Clones of the outer repository will not contain the contents of
hint: the embedded repository and will not know how to obtain it.
hint: If you meant to add a submodule, use:
hint:
hint: git submodule add <url> A
hint:
hint: If you added this path by mistake, you can remove it from the
hint: index with:
hint:
hint: git rm --cached A
hint:
hint: See "git help submodule" for more information.
但在阅读子模块时,我认为这不是我想要的,因为它基本上是对另一个存储库内部的一个存储库的引用,我想将这些代码
最后我做的和上面的一样,但是rm -rf A/.git
--当然,我会丢失历史记录,我想保留它。
我该怎么做?
1条答案
按热度按时间flvlnr441#
你不能这样
嗯,你可以,有点,但总的来说,它没有很好的定义:保留一个单独的Git仓库的历史记录是什么意思?仓库中的历史记录就是仓库中的提交。这里的问题是我们使用(主要是)分支和标记名称,同时您可以添加尽可能多的提交(和其他对象)添加到commits-and-other-objects数据库中,因为每个唯一的对象都有一个唯一的名称-它的哈希ID-这样就不会有两个名称冲突,对于分支和标记名来说通常不是这样。
让我们举一个具体但简单的例子,我们发明了两个仓库A和B,分别命名为
Z/A
和Z/B
。仓库A有两个提交,分别创建于1990年1月1日和2032年12月31日仓库B具有三个提交,它们(分别)创建于1970年1月1日、1990年1月1日和1999年12月31日。Z中应该存在多少个提交?2个?3个?4个?5个?为什么?
如果你的答案是2,那么第一次和最后一次提交应该是什么,它们的日期应该是什么?
如果你的答案是三、四或五,它们的日期和内容应该是什么,为什么?
一旦你能系统地回答这个问题,你就能想出一个将原始提交转换成合并库中新的(不同的)提交的过程。新提交不会以任何方式与原始提交相关联,除了合并系统规定的方式。
子模块通过 * 不 * 试图存储 * 其他 * 仓库的提交来回避这个问题。相反,我们创建一个“超级模块”Z,它有多少提交就有多少提交。假设它有两个提交:
如果你愿意的话,你现在可以在Z中进行第三次提交,更新对repo A的引用,使用将来日期的提交,你可以让第三次提交继续使用B中的第三次提交,或者退回到之前的B中的一次提交。A和B保留它们的历史,Z有它自己的独立历史,除了子模块比较麻烦之外,一切都很简单(注意,Z中的超级项目不使用任何分支或标记名来表示A或B。它只使用唯一的哈希ID作为这些克隆中的“名称”)。