" git push"删除未跟踪的远程文件

时间:2015-02-05 09:07:22

标签: git openshift git-post-receive

我正在运行一个允许用户将图像上传到服务器的Web服务器。但是,我使用 git 来管理我的源代码,git push操作会删除服务器上与本地结帐不匹配的任何内容 - 所以每次运行时都会丢失图像git push

起初我以为我可以保护上传文件夹,所以我尝试了其他帖子中建议的所有这些内容:

  • 将目录添加到.gitignore,
  • git rm --cached -r uploads
  • git update-index --assume-unchanged uploads

这些都没有解决问题 - 当我git push时,远程目录总是消失。

接下来,我决定将上传的文件放在git工作区之外,以便git push不删除它。然后我从公共目录创建了一个符号链接到私有目录,这样我就可以公开看到这些文件了。到目前为止一切都那么好......但是,每当我运行git push时,它都会删除符号链接!

最后,我想也许每次推送时都可以使用 post-receive git hook来创建符号链接,但是我的web服务器(openshift)已经在使用该钩子了。并且不允许我编辑它。

肯定有一种简单的方法可以做到这一点?!请帮忙!

3 个答案:

答案 0 :(得分:2)

与大多数平台即服务提供商一样,每次push时,OpenShift都会部署应用程序的全新版本。默认情况下,Git未跟踪的任何内容都不会包含在新版本中。

您有几个选择:

  1. OpenShift支持persistent data storage using a special directory

      

    存储必须在部署中保留的文件的最佳做法是使用'数据'位于git存储库一级的目录。您可以使用$ OPENSHIFT_DATA_DIR env变量在主机上引用它。例如:

         

    如果您创建一个名为" bunny"的php应用程序。 repo的php / index.php文件部署到:

         

    〜/ {cartridge name} /repo/php/index.php

         

    然后,数据目录被部署到

         

    〜/ {cartridge name} / app-root / data /

         

    因此,从php / index.php文件中,如果将文件保存到" ../../../ data / blah.txt"它将被放置在repo目录之外的数据目录中。

  2. 将生成/上传的资源存储在其他位置。

    这是像Heroku这样的PaaS提供商所青睐的方法。而不是在PaaS服务器上存储用户上传和其他生成的内容,store it on something like Amazon S3

答案 1 :(得分:2)

您应该使用部署操作挂钩在OPENSHIFT_DATA_DIR中创建符号链接,您可以在此处查看WordPress快速入门中如何执行此操作的示例:https://github.com/openshift/wordpress-example/blob/master/.openshift/action_hooks/deploy

OPENSHIFT_DATA_DIR在部署之间持续存在,但不会在缩放应用程序中的齿轮之间共享。

答案 2 :(得分:0)

是的,您推送的git repo不应该是具有工作目录的存储库。它应该是一个bare存储库,它以

启动
git --bare init

如果您仍想使用目标计算机,最好的解决方案是使用两个存储库(一个裸存储,一个不存储),推送到裸存,然后使用挂钩,拉到正常。可以在 here 找到此设置的示例。