Git - 如何最好地将多个仓库存储在一个主仓库中?

3
我正在将许多项目移动到GitHub的私有存储库中。其中很多项目已不再积极使用。因此,我不想为每个项目都建立一个专门的存储库 - 我希望将它们全部放在一个“已弃用项目”存储库中。我想这样做并保留每个单独项目的历史记录。
我尝试将项目目录及其 .git 目录放入主要的“已弃用项目”存储库,但似乎不起作用 - 只有目录实际上似乎在主存储库中被跟踪/版本化,而它的文件则没有。
在这种情况下,我可用的最佳选项是什么?我尝试将子目录/项目中的 .git 目录重命名为 .git-directory,这似乎可以解决问题 - 项目中的所有文件都会被正确地添加到主存储库中。如果这确实完全符合我的要求,那么这将是一个可接受的解决方案 - 只需将 .git-directory 文件夹重命名为 .git,如果我确实想将项目移出“已弃用存储库”,并重新开始积极开发。如果有人能确认这种方法是否可行,或者可能导致问题,那将非常有用。
我相当新手,所以任何关于此事的信息都将不胜感激!
1个回答

2

使用子树合并。

概述

子树合并允许您保留每个项目的历史记录,最新提交将在单独的目录中包含每个项目。如果所有项目都不活跃,则这是理想的选择。

您可以像平常一样在 gitk 中浏览历史记录,并且 SHA-1 哈希值得到保留。

机制

假设您在 master-repo 中有主库,要合并的项目在 project 中。以下是步骤:

cd master-repo
git remote add project1 ../project1
git fetch project1
git merge -s ours --no-commit project1/master
git read-tree --prefix=project1 -u project1/master
git commit -m "添加了项目 1"

换句话说,

  1. 将项目作为远程添加,以便将其历史记录带入主存储库。
  2. 将项目合并到主存储库中,但使用一种合并策略,该策略完全忽略来自项目的文件。这使您可以进行合并提交,而实际上不更改任何文件,从而使您稍后可以探索历史记录。
  3. 将项目文件带入子目录,并提交。

请注意,仅此本身不会保留除“master”之外的项目分支。您可以将它们放在其他子目录中以保留它们,或者您可以跳过 read-tree 步骤,并只进行合并提交,而实际上不带入那些分支的文件。


谢谢帮助!当我运行上述代码时,文件会进入主存储库的顶层,但步骤说明我们将把项目文件放入子目录中。我需要改变什么才能做到这一点? - QuakerOat
可以,谢谢!不过我不确定这是否完全符合我的需求——如果我决定再次开始对project1进行开发,我需要做什么?是否有可能从主repo中提取一个只包含project1历史记录的project1 repo? - QuakerOat
由于所有历史记录仍然存在,您可以只获取project1的最新提交并为其创建一个分支,然后在新存储库中检出该分支。之后,从该存储库中删除所有其他分支。新存储库将是旧project1存储库的精确副本,直到SHA-1哈希值都相同。(如果有更多分支,则需要执行更多步骤。) - Dietrich Epp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接