git filter-branch不会删除任何文件,尽管它会显示所有删除

时间:2018-03-17 15:51:36

标签: git-filter-branch

我有一个包含各种有用代码的大型存储库,并希望将其中的一部分提取到一个新的分支中,以便合并到其他项目中。

所以我想到了以下解决方案:1。创建要保留的文件的路径名列表,2。使用git filter-branch --prune-empty删除所有其他文件,并删除提交的非提交的提交感兴趣的文件。

一切似乎都很好," git filter-branch"甚至显示了所有的删除,看起来非常正确。

但是当它完成时,分支与以前完全一样!

怎么可能?

这正是我所做的:

  1. 创建存储库中所有文件的列表,作为文本文件"有用":

    $ git log --name-status | sed' s / ^ [A-Z] [[:space:]] {1,} //; t; d' |排序>有用

  2. 编辑列表并删除包含 not 保存在存储库中的文件的所有行,i。即创建要保留的文件白名单:

    $" $ EDITOR"有用的#从列表中删除您不想保留的内容

  3. 导出环境变量,以便在执行" git filter-branch"时找到列表:

    $ export w =" $(pwd)"

  4. 执行过滤操作:

    $ rm -r - .git-rewrite; git filter-branch -f --tree-filter' git ls-files -c |排序| comm -23 - - " $ w" /有用|而IFS =读-r f;做git rm --cached - " $ f&#34 ;;做' --prune空

  5. 如上所述,只需告诉" git filter-branch"这似乎工作正常。但它没有做任何事情。

    --tree-filter命令表达式的基本解释:

    • 首先" git ls-files -c"用于创建已通过filter-branch加载到索引中的文件列表。

    • 此列表的排序方式与"有用的#34;相同。列表已经。

    • 然后" comm"运行以比较" ls-files"返回的文件列表。使用文件中的白名单"有用"。结果将是索引中存在的文件列表,但不会出现在白名单中。

    • 比较的输出由循环读取,该循环发出" git rm --cached"除白名单中的文件外的所有文件的命令。

1 个答案:

答案 0 :(得分:0)

我是****我:我想使用--index-filter,但实际上写了“--tree-filter”!

难怪没有任何改变,因为我只删除了索引中的文件,而不是从实际工作目录中删除。

改变之后,一切都运转良好!!!

相关问题