110

我继承了一个 git 存储库,其中包含不同目录中的多个项目。我想将存储库拆分为新的单独存储库,每个项目一个,然后让主存储库将项目包含为子模块。如果可能的话,我想在保持各个项目的修订历史的同时完成所有这些工作。

我可以为每个项目克隆存储库并每次删除所有其他项目,但是有更好的方法来避免在每个新项目存储库中都有克隆的历史记录吗?

4

3 回答 3

99

你可以用它git filter-branch来改写一个项目的历史。从文档中:

要重写存储库,使其看起来好像 foodir/ 是其项目根目录,并丢弃所有其他历史记录:

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

为您的存储库制作多个副本,为您要拆分的每个子目录执行此操作,然后您应该得到您正在寻找的内容。

于 2009-05-01T13:39:42.170 回答
4

要将文件夹导出为新存储库,您需要:

  1. 克隆要导出的文件夹所在的存储库。
  2. 在您的托管服务提供商上创建一个空存储库作为 GitHub,以存储导出的文件夹。
  3. 打开克隆的存储库文件夹并运行以下命令:

    git subtree push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master
    
于 2016-11-27T18:33:36.790 回答
2

git 的重点是历史通过散列父提交体现在每个提交中。您可以将提交(这本质上是 svn-importer 的工作方式)“重播”到一个新的存储库中,并且只保留每个子项目。然而,这会破坏提交哈希的含义。如果你对此没有任何问题,那就这样吧。

在过去,我只是克隆它并继续前进。这使事情变得更大,但磁盘空间很便宜;我的时间很昂贵。

我也不知道有什么工具可以拼接出一个目录。我想你可以在目录上 git-log 找到所有提交,然后用 git-fast-export 之类的东西重放提交?

于 2009-05-01T13:30:03.957 回答