这是一种猜测,因为我们确实需要确切地知道是哪个 git 操作序列导致文件被删除才能确定。但是,要理解的关键点(并且被广泛误解)是 git 的忽略机制是为“一次性”文件设计的,例如构建产品。它不是为珍贵的文件设计的,但您不想保留在存储库中。 (作为这些陈述的参考,these emails on the git mailing list 对此进行了讨论。)
为您描述的情况提供一个示例场景,假设在版本 a1b2c3 中,您在存储库中提交了以下文件:
pdfs/0001.pdf
pdfs/0002.pdf
在历史的某个后期阶段(比如在您当前的master),您已经删除了所有使用git rm -rf 跟踪的PDF,并将pdfs 目录添加到.gitignore。但是,您的 Web 应用程序仍在生成 PDF 并将它们放入 pdfs 子目录,现在您有以下被忽略的文件:
pdfs/0001.pdf
pdfs/0002.pdf
pdfs/0003.pdf
pdfs/0004.pdf
现在可能发生的情况是,如果您决定检查旧版本的代码,使用:
git checkout a1b2c3
... git 将看到它想要从该版本更新 pdfs/0001.pdf 和 pdfs/0002.pdf,并且由于这些路径当前被忽略,它决定它们可以被静默覆盖。 (毕竟,这是您希望构建产品发生的事情。)
然后,当您返回master 时,使用:
git checkout master
... git(相当合理地)认为删除所有这两个 PDF 是可以的,因为它们已经从存储库中删除了 a1b2c3。所以,你只剩下:
pdfs/0003.pdf
pdfs/0004.pdf
...您的应用程序创建的原始忽略的pdfs/0001.pdf 和pdfs/0002.pdf 消失了。
这可能并非完全发生的情况,但它是一组明显合理的操作的示例,这些操作可能会导致从您的生产服务器中丢失一些 PDF。
我建议的实际解决方案是为存储库中从未的 PDF 创建一个新目录。然后签出不同版本的代码永远不要触及该目录。