【问题标题】:using git in a production server在生产服务器中使用 git
【发布时间】:2011-09-20 08:11:43
【问题描述】:

我有一个 php webapp,它必须在指定的文件夹中生成一些 pdf 文件。在生产服务器上,我也在使用 git,问题是一些 pdf 文件不时消失。在 .gitignore 我添加了我的 pdf 文件夹和 *.pdf

git 是否有可能删除我的 *.pdf 文件?

【问题讨论】:

  • 这些 PDF 文件以前是否在存储库中进行过跟踪?您是否在生产服务器上的新旧版本代码之间切换?
  • 是的,直到某个时间点,git 也跟踪了 pdf 文件。

标签: git production-environment


【解决方案1】:

这是一种猜测,因为我们确实需要确切地知道是哪个 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.pdfpdfs/0002.pdf,并且由于这些路径当前被忽略,它决定它们可以被静默覆盖。 (毕竟,这是您希望构建产品发生的事情。)

然后,当您返回master 时,使用:

git checkout master

... git(相当合理地)认为删除所有这两个 PDF 是可以的,因为它们已经从存储库中删除了 a1b2c3。所以,你只剩下:

pdfs/0003.pdf
pdfs/0004.pdf

...您的应用程序创建的原始忽略的pdfs/0001.pdfpdfs/0002.pdf 消失了。

这可能并非完全发生的情况,但它是一组明显合理的操作的示例,这些操作可能会导致从您的生产服务器中丢失一些 PDF。

我建议的实际解决方案是为存储库中从未的 PDF 创建一个新目录。然后签出不同版本的代码永远不要触及该目录。

【讨论】:

    【解决方案2】:

    首先,我不明白为什么 PDF 文档会放在源代码树中。如果我总是将上传的材料存储在不同的文件夹中,那么我会在您的应用程序的源代码中存储。

    其次,我不认为 Git 会为你隐藏你的 PDF。如果你的 .gitignore 像你说的那样设置,当然不会。恐怕其他进程会干扰您的 PDF。

    除了 Git 可能不会导致这种情况,我推荐以下方法。

    1. 让您的应用程序商店将材料上传到应用程序本身的源代码文件夹之外。
    2. 不要在服务器上提交(我不知道你是否这样做,但如果在实时环境中修复问题是常见的做法,我可以想象会出现问题)。在实时服务器上,您应该只提取代码,而不要做任何其他事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 2016-07-09
      • 2012-10-19
      相关资源
      最近更新 更多