我想删除所有在git存储库历史记录中既不是"foo“也不是"bar”的文件。考虑到rm -rf !(foo|bar)用于删除当前目录中既不是"foo“也不是"bar”的文件。我想出了以下的想法:
$ git filter-branch --tree-filter 'rm -rf !(foo|bar)' --prune-empty HEAD
然而,这产生了下面的错误,我真的不明白为什么它不能工作。
Rewrite 75c1ec1ef083338ca2e88db9cc6107c1630d91e9 (1/871)~/libexec/git-core/git-filter-branch: 1: eval: Syntax error: "(" unexpected
发布于 2014-07-13 22:31:32
请参阅https://stackoverflow.com/a/19957874/1870481
要么使用
--tree-filter 'bash preserve-only.sh foo bar'与preserve-only.sh在一起
IFS=':'
GLOBIGNORE="$*"
rm -rf *或使用
--index-filter \
'git rm --cached -r -q -- . ; git reset -q $GIT_COMMIT -- foo bar' \
--prune-empty最后一个特别好。只要删除一切,恢复你想要的。:)
发布于 2016-04-06 15:02:17
我使用了以下代码来完成这个任务:
git filter-branch -f --tree-filter "bash -O extglob -c 'rm -rf ./path/to/!(FILENAME_TO_KEEP)'" HEAD具体来说,将-O extglob传递给bash允许您使用感叹号语法。
发布于 2014-07-13 22:19:39
当前的问题是!(foo|bar)是zsh特定的语法编辑:或者是extglob打开的bash,而sh中不支持。每个过滤器都由实现git-filter-branch (通常为普通sh )的shell脚本使用一个sh运行。
当然,您可以直接调用zsh (或打开extglob的bash命令)来运行该命令。或者,您可以删除不需要的文件的(坏的)名称,而不是他们没有好的名称。
(要使用filter-branch删除文件,使用--index-filter要快得多,它不需要签出每个提交和重新提交。但这是一个内部优化,只有871次提交,并不重要。)
https://stackoverflow.com/questions/24727293
复制相似问题