git filter-branch使用两个查询

时间:2016-08-05 00:20:32

标签: git

我正在尝试关注this link一次删除多个文件。单独使用命令:

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch "UserFiles/*"' --prune-empty --tag-name-filter cat -- --all

工作正常。但是,当我尝试一次合并2个查询时,我得到了错误WARNING: Ref 'refs/heads/master' is unchanged

我试过的命令是:

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch "testDir/*"' && 'git rm --cached --ignore-unmatch "UserFiles/*"' --prune-empty --tag-name-filter cat -- --all

我该如何解决?

2 个答案:

答案 0 :(得分:1)

--index-filter参数通过eval提供给shell。这在实践中意味着如果你需要运行两个不同的索引过滤器,你可以将它们拼写为:

git filter-branch <args> --index-filter 'cmd1; cmd2' <more-args>

请注意,这是一个分号,而不是一个逗号,它在里面引号,使表达式成为--index-filter的单个参数。

但是,在您的特定情况下,您的索引过滤器可能 1 可以使用一个命令完成。一个命令是:

git rm -r --cached --ignore-unmatch UserFiles testDir

使用-r(递归删除)时,不需要/*,因此不需要内部引号。当然,和往常一样,用于索引过滤器的命令必须作为单个参数传递,所以如果它包含空格 - 并且我们可以看到,它确实 - 这个确实需要 外部引用。因此:

git filter-branch -f \
    --index-filter 'git rm -r --cached --ignore-unmatch testDir UserFiles' \
    --prune-empty --tag-name-filter cat -- --all

(我把它分成三行,前两行以反斜杠换行结束,用于发布目的。由于反斜杠 - 换行符让shell继续读取,可以这样输入,或者你可以把它全部转回没有反斜杠的一条大线。)

1 如果您的目的是仅删除UserFilestestDir目录中的文件,而不删除任何子目录和他们的文件,这“可能”是错误的。那就是:

git rm -r --cached testDir

将删除testDir/atestDir/b/ctestdir/b/dtestdir/btestdir/ctestdir本身,同时:

git rm --cached "testDir/*"

只会删除testDir/atestDir/c,而testDir/b/保持不变。如果您需要这样做,则无法使用-r快捷方式。

答案 1 :(得分:0)

在随机检查不同的组合后,我得到了它。它应该是这样的:

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch "testDir/*"', 'git rm --cached --ignore-unmatch "UserFiles/*"' --prune-empty --tag-name-filter cat -- --all