如何删除.gitignore中列出但仍在存储库中的文件?

Int*_*idd 275 git ignore gitignore

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

所以我的问题是,是否有一个使用filter-branch的魔术命令或脚本可以重写我的历史记录并轻松删除所有这些文件?或者只是一个命令,它将创建一个将删除它们的提交?

Sam*_*ane 377

You can remove them from the repository manually:

git rm --cached file1 file2 dir/file3
Run Code Online (Sandbox Code Playgroud)

Or, if you have a lot of files:

git rm --cached `git ls-files -i --exclude-from=.gitignore`
Run Code Online (Sandbox Code Playgroud)

But this doesn't seem to work in Git Bash on Windows. It produces an error message. The following works better:

git ls-files -i --exclude-from=.gitignore | xargs git rm --cached  
Run Code Online (Sandbox Code Playgroud)

关于在没有这些文件的情况下重写整个历史,我非常怀疑有一种自动的方法.
而且我们都知道改写历史很糟糕,不是吗?:)

  • @Cupcake谢谢.`git ls-files -i -z --exclude-from = .gitignore | xargs -0 git rm --cached`似乎可以解决这个问题 (13认同)
  • 不幸的是,Windows 命令上的 Git Bash 不适用于包含空格的路径 (3认同)
  • 我在Windows上遇到了同样的问题.我正在使用powershell,在我的情况下,我得到了@ samy-dindane的第三个命令并将其改为foreach.它变成了这个`git ls-files -i --exclude-from = .gitignore | %{git rm --cached $ _}` (3认同)

gta*_*atr 299

可以在任何操作系统上运行的更简单方法

git rm -r --cached .
git add .
git commit -m "Removing all files in .gitignore"
Run Code Online (Sandbox Code Playgroud)

你基本上读取了所有文件,除了.gitignore中的文件

  • 不要这样做,它将删除所有文件的历史记录 (9认同)
  • 这绝对应该是公认的答案,并且您不会远程记录文件的历史记录(无论如何您可以在提交之前始终进行检查)。刚刚针对我在 GitHub 上的存储库进行了操作,完美删除了所有不需要的文件,并且历史记录仍然存在!谢谢! (6认同)
  • 假提交消息是什么意思?这是一个真正的提交消息:P 当然,您可以根据您的需要更改消息...... (4认同)
  • @agrath 你在哪里测试的?哪个版本的git?哪个操作系统?在 MacOS 和 git 2.27.0 上我的情况并非如此 (4认同)
  • 只是为了完整起见,您最后需要 git push 命令。 (2认同)
  • 只是为了澄清一下,因为执行“git rm -r --cached .”之后的“git status”可能看起来有点可怕:@gtatr 提供的这三个命令本质上是从 git 中删除之前跟踪的文件,但已添加到您的 .gitignore 文件中。当我第一次运行这个时,我看到了一堆文件,吓了一跳,但经过进一步检查,我注意到它们都是我的 .gitignore 文件中列出的文件。 (2认同)
  • @agrath,您应该删除您的评论或澄清它。我无法确认任何文件的历史记录都会被删除。 (2认同)
  • @AnjanBiswas - 这取决于你的 gitignore 中有什么...... (2认同)

小智 126

由于未跟踪.gitignore中的文件,因此可以使用git clean命令以递归方式删除不受版本控制的文件.

使用git clean -xdn进行试运行,看看将被删除.
然后git clean -xdf用来执行它.

基本上,git clean -hman git-clean(在unix中)会给你帮助.

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

希望能帮助到你.

  • 这个答案不适用 - OP说``.gitignore`*中的文件正被跟踪. (24认同)
  • 谨防!这将永久删除所有未跟踪的文件,而不是仅从分支中删除 (12认同)
  • -1:这是一个极具误导性的答案-原始海报想要从存储库中删除,而不是完全删除文件。我已经快要删除IDE所需的动态文件负载,而并非要求将其包含在存储库中。 (9认同)
  • 这应该是公认的答案.它确实有效(接受的答案对我来说不起作用,在macOS上),而且它更清洁. (5认同)
  • `git clean -xdn` 是一个不会删除的试运行。下一个会。 (5认同)

Sco*_*sen 7

我通过使用 sed 操作 .gitignore 语句的输出做了一个非常简单的解决方案:

cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash

解释:

  1. 打印 .gitignore 文件
  2. 从印刷品中删除所有评论
  3. 删除所有空行
  4. 将“git rm -r”添加到行首
  5. 执行每一行。

  • `sed` 很简单吗? (13认同)

小智 6

git rm --cached -r . 递归删除所有缓存

git add . 添加 .gitignore 中未包含的所有文件

您将必须提交一些已删除的文件,这些文件在文件系统上并未真正删除

使用单个命令将是 git rm --cached -r . && git add .