【问题标题】:How can I force git to NOT replace folder contents?如何强制 git 不替换文件夹内容?
【发布时间】:2014-11-17 09:46:39
【问题描述】:

我在 cloudcontrol.com 上托管我的 php 项目,在我的项目中,我有一个静态文件夹,用于保存用户个人资料图片,如下所示:

uploads/profile/userpic1.jpg
uploads/profile/userpic2.jpg
uploads/profile/userpic2.jpg

我用 .gitignore 文件 .gitignore 配置文件文件夹内的所有文件:

*
!.gitignore

在我的本地环境中,当我进行一些测试时,我会在该文件夹中上传一些图片。 在我的生产环境中,用户还会更改他们的个人资料图片并将其保存在该文件夹中。

我的问题是:

每当我将任何更新推送到生产服务器时,我都会丢失服务器上配置文件目录中的所有文件! 似乎 git (或 cloudcontrol) 替换配置文件目录不仅更新其内容而不触及旧文件/图片。

任何建议我该如何解决这个问题。我认为这只是一个 .gitignore 问题,我尽一切努力完成这项工作,但我做不到。我对 Git 和 PaaS 有点陌生。

谢谢

【问题讨论】:

    标签: php git cloudcontrol


    【解决方案1】:

    cloudControl 与大多数云应用程序托管商一样,会在部署时替换整个应用程序文件夹。这样做通常是为了允许水平扩展并确保每个部署都基于相同的(空)状态。

    另请参阅non-persistent filesystem 上的文档:

    非持久文件系统

    TL;DR:

    • 每个容器都有自己的文件系统。
    • 文件系统不是持久的。
    • 不要将上传内容存储在文件系统中。

    cloudControl 平台上的部署可以访问可写文件系统。然而,这个文件系统不是持久的。写入的数据可能会或可能不会在未来的请求中再次访问,具体取决于routing tier 在可用容器之间路由请求的方式,并在每次部署后被删除。这确实包括您手动触发的部署,但也包括在正常操作期间由平台本身完成的重新部署。

    对于客户上传(例如用户个人资料图片),我们推荐 Amazon S3 等对象存储或 MongoLab Add-on 中提供的 GridFS 功能。

    因此,如果您想动态存储文件,则必须为此寻找单独的解决方案。

    【讨论】:

    • 现在说得通了!非常感谢戳
    【解决方案2】:

    这就是大多数使用 git 的部署应用程序的工作方式。无论如何,git 不是最适合版本控制资产,它应该主要用于代码。话虽如此,您仍然可以使用.gitignore,只要您在想要版本化的内容和不想要版本化的内容之间有一个明确的标识符。说你自己的所有文件都以version这个词开头,你可以这样做

    /public/assets/images/users/*
    !/public/assets/images/users/version*
    

    【讨论】:

    • 我对 Git 和云部署完全陌生,几乎我需要对项目中的每个文件进行版本控制,但我猜上传和缓存文件夹..我现在必须找出如何实现带有 cloudcontroll 和 laravel 的 aws s3 :) .. 谢谢 Integral ;)
    • S3 实际上很容易与 laravel 一起使用,因为你已经有了 composer。这是一个链接,可以让您愉快地前往:docs.aws.amazon.com/aws-sdk-php/guide/latest/quick-start.html
    • 有帮助,非常感谢
    猜你喜欢
    • 2016-12-01
    • 2020-10-24
    • 2012-12-26
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多