使用 git rebase 忽略恶意文件

Ignoring naughty files with git rebase

我有一个 GitHub 存储库,主要保存 .tex 文件,Makefile 编译所有文件以创建 .pdfs。在此 repo 上,.gitignore 文件用于忽略与此相关的一些编译文件,最显着的是 .pdfs 本身。现在我还有一些文件不是编译 .tex 文件的结果,因此不应被 git 忽略。我最近在我的 .tex 文件中添加了一些代码(使用 minted 包)来创建两种特定类型的编译文件,即 .pygstyle.pygtex。这些文件是我不想保留在 repo 中的文件,因此我将它们添加到我的 .gitignore--在之前的提交中已经添加它们之后:(.

我想找到我必须键入的命令,以便以一种不会从源代码管理中删除 .gitignore 中的所有文件的方式重新设置此分支,因为有一些我想保留的.pdf,但是我上面提到的编译文件应该被忽略。

我试着用正常的方式rebase,却发现了那些无法忽略的丢失文件;从那以后,我一直漫无目的地重新定位到新的分支机构,但收效甚微。

理想情况下,有一种方法可以将 .gitignore 文件追溯应用到引入 "naughty files" 的提交中,而无需删除手动添加的其他文件以绕过 .gitignore

我考虑过不使用 rebase(例如,通过简单地将 .gitignore 应用于所有文件的子集),但我想保持它的干净并改用 git rebase

如果您的顽皮文件很小,我建议您直接 git rm 处理它们并提交结果。从那时起,.gitignore 将按照您的意愿工作,因为这些文件将不再存在于您将要处理的提交中。

如果你的顽皮文件很大,你可以使用git filter-branch重写没有这些文件的历史记录。如果您选择这条路线,这个问题将有所帮助:How to remove/delete a large file from commit history in Git repository?

有关一些附加信息,.gitignore 文件仅影响 git add 中发生的事情以及将沙箱的当前状态与当前提交进行比较的操作。当你变基时,你要求 Git 按原样(默认情况下)重新应用给定的提交及其拥有的文件和补丁。您必须编辑提交以从中删除文件,上一段中链接的问题解释了如何手动或通过 git filter-branch.

执行此操作