【问题标题】:git filter-branch with --subdirectory-filter removes all files带有 --subdirectory-filter 的 git filter-branch 删除所有文件
【发布时间】:2015-09-29 07:02:19
【问题描述】:

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

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但每个提交都不再引用任何文件,因为它们都消失了!强>

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

提前致谢!

西蒙

【问题讨论】:

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


    【解决方案1】:

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

    这会导致一个空的存储库,其中包含正确过滤的历史记录 (\):

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

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

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

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

    免责声明

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-03-29
        • 2020-07-22
        • 2012-08-16
        • 1970-01-01
        • 1970-01-01
        • 2014-06-06
        • 1970-01-01
        • 2010-10-17
        • 1970-01-01
        相关资源
        最近更新 更多