使用带有--subdirectory-filter的git filter-branch命令会删除所有文件。

5

我希望进行一个很标准的代码库分离。 原代码库结构如下:

root
|-AAA
|-BBB
  |-BBB1
  |-BBB2
|-CCC

我尝试使用以下命令将目录BBB1及其所有内容提取到一个独立的存储库中:
git filter-branch --subdirectory-filter BBB/BBB1 -- --all

这会导致Git重写一些提交并以Git的最终声明结束。
Ref 'refs/heads/master' was rewritten

所以,这对我来说似乎非常完好无损。但当我查看git完成后的root目录时,仓库不再包含任何源文件,而只有位于root.git文件夹。浏览SourceTree中的该存储库,我可以在日志中看到(可能)正确的提交,这些提交仅会影响BBB1,但由于所有文件都不见了,所以每次提交都没有引用任何文件! 我做错了什么?为什么所有文件都没了,甚至是我实际过滤的那些文件?谢谢!西蒙
2个回答

11

请确保即使在Windows机器上,您也使用Unix风格的路径分隔符(/)。

这将导致具有正确过滤的历史记录(\)的空存储库:

git filter-branch --subdirectory-filter BBB\BBB1 -- --all

这将导致您的子目录提取到存储库的根目录中,并具有正确过滤的历史记录(/):

git filter-branch --subdirectory-filter BBB/BBB1 -- --all

由于在Windows命令行中使用/目录分隔符时往往会失去自动完成的功能,因此可能更容易先创建您的路径,然后将其更改为Unix风格的分隔符。

免责声明

我知道原始问题显示/分隔符,但是如果您在子目录参数中传递\分隔符,则将看到所描述的完全相同的最终结果,这让我感到怀疑。一旦您转换为Windows机器上的Unix风格的/分隔符,它就能完美运行。


1
这同样适用于 git-filter-repo... 花了太多时间试图弄清楚这个问题。使用 Unix 风格的路径分隔符而不是 Windows 分隔符,然后它就可以工作了。 - Tur1ng

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接