如何在Git中永久删除文件而不会出现“警告:Ref'refs/heads/master'未更改”?

36
我一直在谷歌搜索和阅读各种帖子,尝试过以下两个命令:
``` git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch Launcher\lib" --prune-empty -- --all ```
``` git filter-branch --tree-filter "rm -rf Launcher\lib" --prune-empty -- --all ```
但是都只得到了一个警告信息:
``` WARNING: Ref 'refs/heads/master' is unchanged ```
这个代码库有其他克隆版本和一个中央服务器。据我所知,我会将更改推送到服务器,其他人只需要获取并变基(不合并)即可。如果他们已经进行了更改,它是否仍然有效?

筛选分支后有任何更改吗? - Andy
不,文件系统是一样的,我在历史记录中看到了这些文件。 - Tower
1
除了速度之外,index-filtertree-filter版本的命令在最终存储库历史记录方面有什么区别吗?此外,----all--prune-empty参数分别是什么意思? - alpha_989
2个回答

35

好的,问题解决了,原来是路径不对。我把这个:

Launcher\lib

改成了这个:

Launcher/lib/

现在可以正常运行了 ;)


同样地,如果你使用 git mv 移动了文件,旧的提交仍然引用旧位置,所以你应该删除旧位置而不是新位置(或同时删除)。 - Achal Dave
遇到了同样的情况并以相同的方式解决了,但在找到解决方案后才看到了这篇文章。但很好,你已经回答了自己的问题,这对其他人也会有帮助。结论是,在Windows上,git无法识别文件夹路径中的反斜杠。 - Gaurav Parek

8

我将把这个作为未来的参考,因为我也遇到了同样的问题:

如果你使用 cmder (或其他 ConEmu 变种),请使用双引号而不是单引号。

如果你的地址中有一些空格,请用引号括起来:

git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch 'server/bin/some file.txt'" \
--prune-empty --tag-name-filter cat -- --all

当我遇到那个错误时,那就是问题所在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接