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

cid*_*red 109 git git-submodules

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

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

Bri*_*ell 98

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

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

git filter-branch --subdirectory-filter foodir -- --all
Run Code Online (Sandbox Code Playgroud)

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

  • @Adam如果你想在原始项目中保留`foodir`的历史,而不是重写它的历史,只需要`git rm -r foodir`就足够了(这也会删除工作树中的副本;如果你不是我想要,使用`--cached`).如果你想完全从历史中删除它(也回答@ ilius的问题),你想要的东西像`git filter-branch --index-filter'git rm -r --cached --ignore-unmatched foodir' - - -all` (3认同)
  • @ilius抱歉,我之前错过了您的问题,请参阅我上面的回复,以获取有关如何删除目录及其历史记录的答案. (2认同)
  • @ilius是的,这也有效.对于大型项目,`--index-filter`解决方案比`--tree-filter`更快,因为它不必实际检出文件,它可以直接操作索引.然而,`--tree-filter`可以更容易使用,因为您可以使用普通的filsystem操作,而不必使用索引操作操作. (2认同)