如何在git中启用shell选项?

时间:2011-11-08 12:55:43

标签: git git-filter-branch

我想在“索引过滤器”中使用扩展的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选项?

2 个答案:

答案 0 :(得分:2)

您可以通过让she​​ll调用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)

我知道这不是您要的,但仍然可以解决您的问题。我列出了不是docsresearch的路径,然后将其删除。

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

您应该能够对子目录执行类似的操作。