我正在尝试关注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
我该如何解决?
答案 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 如果您的目的是仅删除UserFiles
和testDir
目录中的文件,而不删除任何子目录和他们的文件,这“可能”是错误的。那就是:
git rm -r --cached testDir
将删除testDir/a
,testDir/b/c
,testdir/b/d
,testdir/b
,testdir/c
和testdir
本身,同时:
git rm --cached "testDir/*"
只会删除testDir/a
和testDir/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