如何使用git filter-branch从我的仓库中删除文件? (“您需要从工作树的顶层运行此命令”)

时间:2018-10-02 04:16:37

标签: git

根据git documentation,我可以从仓库历史记录中删除文件,如下所示:

git filter-branch --tree-filter 'rm -rf filename' HEAD

我尝试了此操作,并收到以下错误消息:

You need to run this command from the toplevel of the working tree.

所以,我尝试了这个,并得到了相同的错误:

git filter-branch --index-filter 'rm -f  /dist/bikeMap.html' HEAD

在检查了多个stackoverflow问题之后,我也尝试过

git filter-branch --index-filter 'rm -f  /dist/bikeMap.html' master..HEAD
git filter-branch --tree-filter 'rm -f  /dist/bikeMap.html' --all
git filter-branch --tree-filter 'rm -f  /dist/bikeMap.html' --  --all
git filter-branch --tree-filter 'rm -f  /dist/bikeMap.html' master

等等都给出相同的错误。

git status

On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean

我的git版本是2.11.0

编辑:我现在也尝试过:

git filter-branch --index-filter "git rm --cached --ignore-unmatch dist/bikeMap.html" HEAD
git filter-branch --index-filter "git rm --cached --ignore-unmatch dist/bikeMap.html" -- HEAD
git filter-branch -f --index-filter 'git rm --cached --quiet --force "dist/bikeMap.html"' --prune-empty -- HEAD
git filter-branch -f --index-filter 'git rm --cached --quiet --force dist/bikeMap.html' --prune-empty -- HEAD
git filter-branch -f --index-filter 'git rm --cached --quiet --force dist/bikeMap.html' --prune-empty -- master
git filter-branch -f --index-filter 'git rm --cached --quiet --force dist/bikeMap.html' --prune-empty master
git filter-branch -f --index-filter 'git rm --cached --quiet --force /dist/bikeMap.html' --prune-empty master
git filter-branch -f --index-filter 'git rm --cached --quiet --force /dist/bikeMap.html' --prune-empty HEAD

相同错误。

编辑:进步!

git filter-branch --index-filter 'git rm --cached --quiet --force dist/bikeMap.html' --prune-empty

导致错误

Rewrite 419e8702fd8a5fe9ddad59a0fd7ff008edffdeab (1/47) (0 seconds passed, remaining 0 predicted)    
fatal: pathspec 'dist/bikeMap.html' did not match any files
index filter failed: git rm --cached --quiet --force dist/bikeMap.html

如果我ls dist/bikeMap.html得到

dist/bikeMap.html

因此,它存在。

如何使用git filter-branch从我们的存储库中删除文件?

1 个答案:

答案 0 :(得分:1)

要使用--tree-filter,请将您的rm命令从使用/dist/bikeMap.html更改为使用dist/bikeMap.html,即在前面加上斜杠。

要使用--index-filter,请将命令更改为git rm --cached --ignore-unmatch dist/bikeMap.html,即,将git rm与其他选项一起使用(并删除斜杠)。

(索引过滤器将更快。如果您只想从具有一个命名文件的所有提交中删除一个命名文件,请使用带有git rm --cached --ignore-unmatch的索引过滤器。)