带有 --subdirectory-filter 的 git filter-branch 删除所有文件

Fra*_*ver 3 git git-filter-branch git-subtree

我想拆分一个非常标准的存储库。原始存储库必须具有以下结构:

root
|-AAA
|-BBB
  |-BBB1
  |-BBB2
|-CCC
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下命令将目录 BBB1 及其所有内容提取到一个单独的存储库中

git filter-branch --subdirectory-filter BBB/BBB1 -- --all
Run Code Online (Sandbox Code Playgroud)

这导致 git 重写一堆提交并以 git 的最终语句结束

Ref 'refs/heads/master' was rewritten
Run Code Online (Sandbox Code Playgroud)

所以这对我来说似乎很好。但是,当我看看到目录下的git结束后,库不再包含任何的源文件,但只有git的在文件夹的根。使用 SourceTree 浏览此存储库我可以在日志中看到(可能)正确的提交,这些提交只会影响BBB1但每次提交不再引用任何文件,因为它们都消失了!

我究竟做错了什么?为什么所有文件都消失了,甚至是我实际过滤的文件?

提前致谢!

西蒙

pat*_*dge 7

确保/即使在 Windows 机器上也使用 Unix 样式的路径分隔符 ( )。

这会产生一个带有正确过滤历史记录 ( \)的空仓库:

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

这会导致您的子目录被拉到 repo 的根目录和正确过滤的历史记录 ( /):

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

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

免责声明

我知道原始问题显示了/分隔符,但是如果您\在子目录参数中传递分隔符,您会看到所描述的完全相同的最终结果,这让我持怀疑态度。一旦你/在 Windows 机器上切换到 Unix 风格的分隔符,它就会完美地工作。


小智 1

我遇到了完全相同的问题,无法使用 filter-branch 命令解决它,也没有找到该问题的任何解释。但还有另一种方法可以达到对我有用的类似结果。它基于子树命令。我在这里找到了对该方法的引用,将子目录分离(移动)到单独的 Git 存储库中,并在此处找到了使用它的示例https://makingsoftware.wordpress.com/2013/02/16/using-git-subtrees-for-repository-分离/。我遵循了那篇文章,它对我来说效果很好。