如何在维护历史记录的同时将单个目录从git存储库移动到新存储库?

时间:2009-05-01 13:01:24

标签: git git-submodules

我继承了一个包含多个项目的git存储库。我想将存储库拆分为新的单个存储库,每个项目一个,然后让主存储库将项目作为子模块包含在内。如果可能的话,我希望保留各个项目的修订历史。

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

3 个答案:

答案 0 :(得分:98)

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

  

将存储库重写为   如果foodir /曾经是它的项目根,   并丢弃所有其他历史记录:

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

制作您的仓库的多个副本,为您要拆分的每个子目录执行此操作,您应该了解您正在寻找的内容。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

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

我也不知道用于拼接目录的任何工具。我想你可以git-log在目录上找到它上面的所有提交然后用git-fast-export重放提交?