我想在“索引过滤器”中使用扩展的globbing,例如
git filter-branch --index-filter "git rm --cached --ignore-unmatched Modules/!(ModuleA|ModuleB)"
但是我收到了错误:
eval:第336行:意外令牌附近的语法错误`('
我已经尝试过:
git filter-branch --index-filter "shopt -s extglob && git rm --cached
--ignore-unmatched Modules/!(ModuleA|ModuleB)"
所以一般的问题是:如何为用于评估这些表达式的shell启用特定的shell选项?
答案 0 :(得分:2)
您可以通过让shell调用git filter-branch
为您评估glob(假设您在那里启用了 \ textglob )来规避问题:
git filter-branch --index-filter "git rm --cached --ignore-unmatch $(ls -xd Modules/!(ModuleA|ModuleB))"
更新:您需要向ls
:-x
提供参数,以空格而不是新行和-d
分隔条目,以打印目录名称其内容。对于少数几个文件,您可能还需要添加-w 1000
(或类似的大数字),以使ls
假设一个非常宽的终端,并将所有内容整合到一行中。
答案 1 :(得分:0)
我知道这不是您要的,但仍然可以解决您的问题。我列出了不是docs
或research
的路径,然后将其删除。
PATHS_TO_REMOVE=$(git log --all --pretty=format: --name-only | sed 's@/.*@@' | sort | uniq | egrep -v '^docs$|^research$' | xargs)
git filter-branch -f --index-filter "git rm -r --cached --ignore-unmatch $PATHS_TO_REMOVE" --tag-name-filter cat -- --all
您应该能够对子目录执行类似的操作。