我正在使用git来控制Django 1.7 + Django CMS 3.0.6项目。
在构建各种应用程序等过程中,我最终会收到大量的迁移文件。迁移文件目前包含在我的git仓库中。
到目前为止,我一直试图避免直接在我的仓库中包含虚拟环境文件,因为它看起来相当混乱和多余。相反,我到目前为止在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仓库中包含venv。
所以我看到它有两个选择:
1. include the virtual env in my git repo
2. drop the migration files from git
哪个选项更好,为什么 - 还是有第三种更好的方法?
#1的缺点是不必要的臃肿。选项#2的缺点是丢失了迁移历史记录,这可能是人们想要保留的。
答案 0 :(得分:1)
你永远不会提交虚拟环境,它会破坏目的;你只需要向git添加不必要的内容。
相反,冻结需求并提交文件:
pip freeze > requirements.txt
在服务器上安装软件包:
pip install -r requirements.txt
答案 1 :(得分: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中的迁移不再用于南方的结果,因为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)的效果。由于迁移信息不再位于虚拟环境目录中,因此不再有任何理由考虑将虚拟环境包含在回购中的相当不具吸引力的可能性。