我有一个包含各种有用代码的大型存储库,并希望将其中的一部分提取到一个新的分支中,以便合并到其他项目中。
所以我想到了以下解决方案:1。创建要保留的文件的路径名列表,2。使用git filter-branch --prune-empty删除所有其他文件,并删除提交的非提交的提交感兴趣的文件。
一切似乎都很好," git filter-branch"甚至显示了所有的删除,看起来非常正确。
但是当它完成时,分支与以前完全一样!
怎么可能?
这正是我所做的:
创建存储库中所有文件的列表,作为文本文件"有用":
$ git log --name-status | sed' s / ^ [A-Z] [[:space:]] {1,} //; t; d' |排序>有用
编辑列表并删除包含 not 保存在存储库中的文件的所有行,i。即创建要保留的文件白名单:
$" $ EDITOR"有用的#从列表中删除您不想保留的内容
导出环境变量,以便在执行" git filter-branch"时找到列表:
$ export w =" $(pwd)"
执行过滤操作:
$ 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空
如上所述,只需告诉" git filter-branch"这似乎工作正常。但它没有做任何事情。
--tree-filter命令表达式的基本解释:
首先" git ls-files -c"用于创建已通过filter-branch加载到索引中的文件列表。
此列表的排序方式与"有用的#34;相同。列表已经。
然后" comm"运行以比较" ls-files"返回的文件列表。使用文件中的白名单"有用"。结果将是索引中存在的文件列表,但不会出现在白名单中。
比较的输出由循环读取,该循环发出" git rm --cached"除白名单中的文件外的所有文件的命令。
答案 0 :(得分:0)
我是****我:我想使用--index-filter,但实际上写了“--tree-filter”!
难怪没有任何改变,因为我只删除了索引中的文件,而不是从实际工作目录中删除。
改变之后,一切都运转良好!!!