如何将存储库拆分为更小的原子存储库?

时间:2011-02-24 14:39:10

标签: git

我读过“Detach subdirectory into separate Git repository”,但我不太清楚如何使用它来实现我正在寻找的东西。我们目前有一个大项目,包含我们的架构/实体,我们的前端Web流程和我们的REST API的2个版本。如果可能的话,我很乐意将所有这些分成独立的存储库。这是我们目前的目录结构:

lib/Project/Entity/*.pm
lib/Projcet/Data/*.pm
lib/Project/Server/Controller/*.pm
lib/Project/Server/Controller/WS/1/*.pm
lib/Project/Server/Controller/WS/2/*.pm
lib/Project/Server/Form/*.pm

等等。我希望能够获取EntityData目录并将它们移动到新的存储库,并且最好还移动它们:

lib/Project/Schema/Entity/*.pm
lib/Project/Schema/Data/*.pm

对于剩下的文件,我想将它们分成另外两个存储库,一个用于我们的前端服务器,另一个用于REST API。我认为即使REST API有2个不同的版本,我们也可以将它分成2个独立的分支(v1和v2分支)。

我觉得filter-branch几乎就是我想要的东西(可能还有顶部的其他提交来移动文件),但我无法确切地看到如何实现这一点。有没有人有任何建议?

我应该补充一点,也许git rm --ignore-unmatch可能是我想要的,但目前HEAD中的文件结构肯定不是旧版提交中的结构(这个存储库跨越了近十年的历史)。我真正想要的是“接受触摸这些文件的提交:foo但忽略所有其他提交。类似于git log的UNION:)

1 个答案:

答案 0 :(得分:2)

您正在寻找的git命令可以在git filter-branch中找到。它可以采用现有的git树并仅包含其中的某些组件。请注意,重写您的git树。因此,请确保您拥有树的备份或将其复制到另一个目录中并在新目录中运行。

对于子目录中的内容,请注意本手册中描述如何做好的部分:

   To rewrite the repository to look as if foodir/ had been its project
   root, and discard all other history:

       git filter-branch --subdirectory-filter foodir -- --all