我想要一个非常标准的存储库拆分。 原始存储库必须遵循以下结构:
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 ,但每次提交都不再引用任何文件,因为它们都已消失!
我做错了什么?为什么所有文件都消失了,甚至是我实际过滤的文件?
提前致谢!
西蒙
答案 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/使用它的示例。我跟着那篇文章,它对我来说完全没问题。