0

我正在使用 git 对 Django 1.7 + Django CMS 3.0.6 项目进行版本控制。

在构建各种应用程序等的过程中,我最终得到了很多迁移文件。迁移文件当前包含在我的 git 存储库中。

到目前为止,我一直试图避免将虚拟 env 文件直接包含在我的 repo 中,因为它看起来相当混乱和多余。相反,到目前为止,我一直在 repo 中包含一个 pip 需求文件,并在需要时使用它来重新创建虚拟环境。

但是,我最近发现选择在 repo 中包含迁移文件似乎也需要在 repo 中包含所有虚拟 env 文件。我这样说是因为在将我的项目部署到生产服务器并尝试通过 python manage.py 运行任何 db 命令(syncdb、makemigrations 或 migrate)时,我收到错误:

KeyError: u"Migration image_gallery.0001_initial dependencies reference nonexistent parent node (u'cms', u'0004_auto_20141108_1256')"

而即使在删除数据库之后,我的本地计算机上也不会发生此类错误。

我跟踪了这​​个错误的根源,因为我的本地机器上的虚拟环境引用了“0004_auto_20141108_1256”(在 django-cms 包内 - 似乎一些 cms 迁移信息直接记录在虚拟环境目录本身内)而生产环境则没有 - 因为生产 venv 是通过 pip 需求文件创建的。因此,即使所有第三方库都相同,这两个虚拟环境也不完全匹配。目前我没有在我的 git repo 中包含 venv。

所以在我看来,我有两个选择:

1. include the virtual env in my git repo
2. drop the migration files from git

哪个选项更好,为什么 - 或者是否有第三种更好的方法?

#1 的缺点是不必要的膨胀。选项 #2 的缺点是丢失了迁移历史记录,这是一个可能想要保留的东西。

4

2 回答 2

1

你永远不会提交虚拟环境,它违背了目的;您只需将不必要的内容添加到 git。

相反,冻结需求并提交文件:

pip freeze > requirements.txt

在服务器上安装软件包:

pip install -r requirements.txt
于 2014-12-28T15:34:39.197 回答
0

问题出在我的 django settings.py 文件中:

MIGRATION_MODULES = {
    'cms': 'cms.migrations_django',
    'menus': 'menus.migrations_django',
    'djangocms_file': 'djangocms_file.migrations_django',
    ...
}

我不得不介绍上述内容以使 django-cms 3.0.6 与 django 1.7 一起使用,这是因为 django 1.7 中的迁移不再使用 South 完成,因为 django 1.7 现在拥有自己的迁移系统,而 cms 3.0 .6. 仍然希望迁移默认由 South 管理。

但是,上述配置的效果是将迁移存储在上述路径中,在我的情况下,这些路径直接指向虚拟环境。因此迁移信息被存储在虚拟环境目录中,导致部署到生产时出现问题。

为了解决这个问题,我修改了我的项目目录结构以包含一个名为“migrations”的文件夹:

myproject/manage.py
myproject/migrations/
myproject/myproject/
...

并将配置修改为:

MIGRATION_MODULES = {
    'cms': 'migrations.cms.migrations_django',
    'menus': 'migrations.menus.migrations_django',
    'djangocms_file': 'migrations.djangocms_file.migrations_django',
    ...
}

这具有现在将所有迁移文件存储在 django 项目本身(以及扩展 git repo)中的效果。由于迁移信息不再位于虚拟 env 目录中,因此不再有任何理由考虑将虚拟 env 包含在 repo 中的相当不吸引人的可能性。

于 2014-12-28T22:59:23.277 回答