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

mat*_*pie 64 git import history export

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

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

jam*_*san 94

引用一个例子 git-filter-branch(1)

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

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

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

  • 只需确保在原始存储库的克隆上运行它,因为它擦除了其余的repo. (43认同)
  • 当您只保留一个目录的历史记录时,您希望生成的克隆更小,但是需要做更多的工作.在进行filter-branch之后缩小它的最简单方法是再次克隆.有关详细信息,请参阅git-filter-branch(1)联机帮助页("用于缩小存储库的检查表"). (6认同)
  • @AdamMonsen:你可以做`git gc`而不是克隆回购. (3认同)

Jam*_*ook 8

对于 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"
Run Code Online (Sandbox Code Playgroud)