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

时间:2015-09-29 07:02:20

标签: git git-subtree git-filter-branch

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

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 个答案:

答案 0 :(得分:2)

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

这会产生一个空的回购,其中包含正确过滤的历史记录(git filter-branch --subdirectory-filter BBB\BBB1 -- --all):

  

/

这会导致您的子目录上拉到仓库的根目录和正确过滤的历史记录(git filter-branch --subdirectory-filter BBB/BBB1 -- --all):

  

/

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

声明

我知道原始问题显示\个分隔符,但是如果你在子目录参数中传递/个分隔符,你会看到完全相同的最终结果,这让我持怀疑态度。一旦你在Windows机器上翻转到Unix风格的Eg. <time pubdate="P16M2S">16:02</time> 分隔符,它就能完美运行。

答案 1 :(得分:0)

我遇到了完全相同的问题,无法使用filter-branch命令解决它,也没有找到问题的任何解释。但还有另一种方法可以达到对我有用的类似结果。它基于子树命令。我在这里找到了对该方法的引用Detach (move) subdirectory into separate Git repository以及在https://makingsoftware.wordpress.com/2013/02/16/using-git-subtrees-for-repository-separation/使用它的示例。我跟着那篇文章,它对我来说完全没问题。