使用历史记录在Git中导出子树

时间:2009-11-02 18:03:31

标签: git import export history

我的Git存储库中有一个文件夹,我想迁移到自己的存储库。是否可以将该文件夹的历史记录与文件夹一起移动?

我之前在子文件夹上只做git rm -r --cached subfolder/然后git init。但是,历史记录不会导入新存储库。

2 个答案:

答案 0 :(得分:94)

引用git-filter-branch(1)

中的示例
  

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

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

因此,您可以将库子目录转换为自己的存储库。注意 - 将过滤器分支选项与修订选项分开,并且--all重写所有分支和标记。

答案 1 :(得分:4)

对于 2021 年(或之后)来到这里的其他人,核心 git 团队不强烈推荐 git filter-branch。

<块引用>

警告 git filter-branch 有很多陷阱,这些陷阱可能会对预期的历史重写产生不明显的破坏(并且由于它的性能如此糟糕,因此您几乎没有时间调查此类问题)。这些安全和性能问题无法向后兼容修复,因此不推荐使用它。请使用替代的历史过滤工具,例如 git filter-repo。如果您仍然需要使用 git filter-branch,请仔细阅读 SAFETY (and PERFORMANCE) 以了解 filter-branch 的地雷,然后警惕地尽可能多地避免其中列出的危害。

相反,推荐的工具是 git-filter-repo,它可以轻松解决此问题

git filter-repo --path subfolder/   # Filter the repo to just the sub-dir
git mv subfolder/* .                # Move the contents of the sub-dir to the root
git commit -m "Filtered from main repo"