我的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
答案 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
未展开,无论如何都要做正确的事情
请注意,如果您使用的是*
,则临时目录中包含要过滤的树的副本。否则,它是空的。