我在我的存储库中有一些文件应该被忽略,我将它们添加到.gitignore,但是,当然,它们不会从我的存储库中删除。

所以我的问题是,是否有一个神奇的命令或脚本使用过滤器分支,可以重写我的历史,并轻松删除所有这些文件?或者只是一个创建提交并删除它们的命令?


当前回答

由于.gitignore中的文件没有被跟踪,您可以使用git clean命令递归地删除不受版本控制的文件。

使用git clean -xdn执行一个演练,看看将删除什么。 然后使用git clean -xdf来执行它。

基本上,git clean -h或man git-clean(在unix中)将为您提供帮助。

注意,该命令还将删除暂存区域中不存在的新文件。

其他回答

不管操作系统是什么,一个更简单的方法是

git rm -r --cached .
git add .
git commit -m "Drop files from .gitignore"

你基本上删除并重新添加所有文件,但是git add会忽略.gitignore中的文件。

使用——cached选项将文件保存在文件系统中,这样就不会从磁盘中删除文件。

注意: 有些人在评论中指出,你将失去所有文件的历史记录。我在MacOS上用git 2.27.0进行了测试,结果不是这样。如果你想检查发生了什么,在你提交之前检查你的git diff HEAD~1。

您可以手动从存储库中删除它们:

git rm --cached file1 file2 dir/file3

或者,如果你有很多文件:

git rm --cached `git ls-files -i -c --exclude-from=.gitignore`

但是这在Windows上的Git Bash中似乎不起作用。它产生一个错误消息。以下方法效果更好:

git ls-files -i -c --exclude-from=.gitignore | xargs git rm --cached  

在Windows上的PowerShell工作得更好(处理路径和文件名中的空格):

git ls-files -i -c --exclude-from=.gitignore | %{git rm --cached $_}

关于在没有这些文件的情况下重写整个历史,我非常怀疑是否有自动的方法来做到这一点。 我们都知道改写历史不好,不是吗?:)

Git rm——cached -r。 以递归方式删除所有缓存

Git添加。 添加所有未包含在.gitignore中的文件

你将不得不提交一些在文件系统上没有真正删除的已删除文件

使用一个命令就可以了 Git rm——cached -r。&& git添加。

在linux中,你可以使用这个命令:

例如,我想删除*.py~,所以我的命令应该是==>

找到。name "*.py~" -exec rm -f {} \;

当你将。gitignore模式添加到。gitignore后,git会忽略匹配的文件。

但是存储库中已经存在的文件仍然存在。

使用git rm files_ignored;Git提交-m 'rm no use files'删除被忽略的文件。