我有一个php webapp,它必须在指定的文件夹中生成一些pdf文件。 在生产服务器上,我也在使用git,问题是一些pdf文件不时消失。 在.gitignore上,我添加了我的pdf文件夹和* .pdf
git是否有可能删除我的* .pdf文件?
这是一个猜测,因为我们确实需要确切地知道哪些git操作序列导致文件被删除才能确定。 但是,要理解(并且被广泛误解)的一个关键点是,git的ignore机制是为“一次性”文件(例如构建产品)设计的。 它不是为珍贵的文件设计的,但是您不想保留在存储库中。 (作为这些语句的参考, 在git邮件列表中的这些电子邮件中对此进行了讨论。)
为了给出您描述的情况的示例场景,假设在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创建一个新目录。 然后,签出不同版本的代码时,切勿触摸该目录。
首先,我不明白为什么将PDF文档放置在源代码树中。 如果我总是在哪里,我总是将上传的资料存储在另一个文件夹中,那么您的应用程序的源代码。
其次,我认为Git不会为您隐藏PDF。 如果您的.gitignore设置如您所说的那样,当然不是。 恐怕其他进程正在干扰您的PDF。
除了Git可能不会导致这种情况,我建议以下内容。