用于特定目标文件夹的git filter-branch rm通配符

时间:2017-03-21 09:22:37

标签: git

我的git存储库( root / packages / files here )下面有一个名为packages的目录,而另一个子文件夹中有一个名为packages的目录( root / directory1 / packages / files此处)。我想确保前者中的所有内容都被删除,后者保持不变。这个命令会匹配吗?如果是,我该怎么做才能确保git rm只定位 root / packages / all files

git filter-branch --index-filter 'git rm --cached --ignore-unmatch packages/*' --prune-empty HEAD

1 个答案:

答案 0 :(得分:0)

因为这是--index-filter而不是--tree-filter,所以最好保护来自shell的全局字符* 1 那是:

git filter-branch \
    --index-filter 'git rm --cached --ignore-unmatch "packages/*"' \
    ...
例如

。 (在--tree-filter中,*将以通常预期的方式运行。)这使得* glob扩展到Git,它只匹配名为{{1}的目录中的名称存储在索引中。 (这就是你想要的。)

作为the git rm documentation notes,这也将匹配目录名称。由于缺少packages/,它不会删除这些目录,但它仍会匹配它们。如果没有这样的目录,这将不是问题。

1 -r命令在临时目录中运行每个过滤器,因此大多数设置下的大多数shell都会结束,filter-branch未展开,无论如何都要做正确的事情

请注意,如果您使用的是*,则临时目录中包含要过滤的树的副本。否则,它是空的。