【问题标题】:Ignore public uploads on commit提交时忽略公共上传
【发布时间】:2018-10-26 23:28:52
【问题描述】:

我遇到了一个问题,每次我对代码进行任何更改时,我的所有用户上传的图像都会被擦除。我认为这是因为它将服务器上的公共上传与我在本地的上传相匹配。

所以我将/public/uploads/* 添加到.gitignore 然后;

git rm -r --cached.
git add .
git commit
git push

没有解决。还尝试添加到.gitignore*/uploads/***/uploads/*/uploads/*

当我部署到 Heroku 时,如何防止我的提交擦除用户上传的内容?

【问题讨论】:

  • 你的意思是部署的时候?
  • 是的。当我部署任何更改(使用 heroku)时,公共/上传中的所有内容都会被擦除,这就是为什么我试图让 git 忽略该文件夹。

标签: ruby-on-rails git heroku


【解决方案1】:

问题不在于 Git¹,而在于 Heroku。它的filesystem is ephemeral:每当您的测功机重新启动时,对文件系统所做的任何更改都会丢失:

每个 dyno 都有自己的临时文件系统,以及最近部署的代码的新副本。在 dyno 的生命周期中,它的运行进程可以将文件系统用作临时暂存器,但是任何其他 dyno 中的进程都看不到写入的文件,并且在停止或重新启动 dyno 时,任何写入的文件都将被丢弃。例如,每当由于应用程序部署而更换测功机时都会发生这种情况,并且作为正常测功机管理的一部分,大约每天一次。

当您部署新版本和 in other situations 时会发生这种情况,至少每天一次。

official recommendation from Heroku 用于将上传的文件存储在 Amazon S3 等第三方服务上。


¹尽管可能值得验证您的 .gitignore 是否配置正确,因为这也可能是一个问题。尝试运行git check-ignore -v public/uploads/some-file-that-exists。您应该会看到一个引用了导致该文件被忽略的忽略规则的响应。

【讨论】:

  • 天哪。 Heroku 是一个巨大的错误。嗯,谢谢你的信息,非常有用。
  • 这肯定是一种不同的主机。这不一定是件坏事:我发现构建东西以便它们在 Heroku(或其克隆)上运行良好可以产生更清洁的架构,无论我实际选择托管在哪里。