git 如何整合存储库?

blpfk2vs  于 2022-11-20  发布在  Git
关注(0)|答案(1)|浏览(161)

我有多个存储库,我想将它们整合到一个名为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--当然,我会丢失历史记录,我想保留它。
我该怎么做?

flvlnr44

flvlnr441#

你不能这样
嗯,你可以,有点,但总的来说,它没有很好的定义:保留一个单独的Git仓库的历史记录是什么意思?仓库中的历史记录就是仓库中的提交。这里的问题是我们使用(主要是)分支和标记名称,同时您可以添加尽可能多的提交(和其他对象)添加到commits-and-other-objects数据库中,因为每个唯一的对象都有一个唯一的名称-它的哈希ID-这样就不会有两个名称冲突,对于分支和标记名来说通常不是这样。
让我们举一个具体但简单的例子,我们发明了两个仓库A和B,分别命名为Z/AZ/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,它有多少提交就有多少提交。假设它有两个提交:

  • 其中一个是1990年1月2日在A中第一次提交和G中第二次提交之后做出的,说:在存储库A中使用第一次提交,在存储库B中使用第二次提交:下面是它们两个散列ID。
  • 另一个例子是最近才做的,但还没有在回购协议A中使用未来日期的提交,它说:在存储库A中使用第一次提交,在存储库B中使用第三次提交:这是它们的两个哈希ID。2 A中使用的提交的哈希ID与同一仓库中的较早提交的哈希ID相匹配。

如果你愿意的话,你现在可以在Z中进行第三次提交,更新对repo A的引用,使用将来日期的提交,你可以让第三次提交继续使用B中的第三次提交,或者退回到之前的B中的一次提交。A和B保留它们的历史,Z有它自己的独立历史,除了子模块比较麻烦之外,一切都很简单(注意,Z中的超级项目不使用任何分支或标记名来表示A或B。它只使用唯一的哈希ID作为这些克隆中的“名称”)。

相关问题