2009-05-01 105 views
109

我已经继承了一个包含多个项目在不同目录中的git存储库。我想将存储库拆分为新的单独存储库,每个项目一个,然后让主存储库包含作为子模块的项目。如果可能的话,我想尽一切努力保持个别项目的修订历史。如何在保持历史的同时将单个目录从git存储库移动到新的存储库?

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

+2

新增混帐子模块的标签,因为这是用于将回购的一部分成子模块非常有用的。 – idbrii 2012-08-01 18:53:24

+0

可能重复[出口子树在Git与历史记录](http://stackoverflow.com/questions/1662753/export-subtree-in-git-with-history) – user 2016-11-27 18:29:57

回答

97

您可以使用git filter-branch来重写项目的历史。从文档:

要重写库看作 如果foodir /曾其项目的根, 并放弃所有其他的历史:

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

让你的回购的多个副本,为每一个你想要拆分的子目录做这件事,并且你应该结束你正在寻找的东西。

1

git的一点是,历史记录通过散列父提交来体现在每次提交中。你可以“重放”提交(这实际上是svn导入程序的工作原理)到一个新的存储库中,只保留每个子项目。但是,这会破坏提交哈希的含义。如果你没有问题,那就这样吧。

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

我也不知道任何工具拼接出一个目录。我想你可以通过git-log来查找目录上的所有提交,然后用git-fast-export之类的东西来重放提交。

+0

我upvoted,因为这是因为不应该是负面的 - 我当然不会采用这种方法,但是通过这样做可以看出他正在尝试 – Alvin 2014-01-04 01:38:11

1

要将文件夹导出为你需要一个新的存储库:

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

    git subtree push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master 
    
相关问题