8

我和一个朋友正在开发一个 Django 应用程序并使用 git。

在我们工作的过程中,我们会在我们的网站上创建虚假帐户、登录并将内容上传到数据库等......出于测试目的。每次合并分支时,我们的数据库文件中都会出现合并冲突。数据库文件位于存储库中,并且由于我们是单独测试的,因此文件的本地副本的开发方式不同。

如何防止数据库文件被跟踪,以便我们每个人都可以保留本地副本?

通过以下方式,我们能够避免使用本地路径:

## settings.py


from os.path import dirname, join

PROJECT_DIR = dirname(__file__)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': join(PROJECT_DIR, 'foo.db'),
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}

理想的情况是:

## settings.py


from os.path import dirname, join

PROJECT_DIR = dirname(__file__)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': join('../../../', PROJECT_DIR, 'foo.db'), # this path is outside the repository (ie, 'Users/sgarza62/foo.db')
        'USER': '',
        'PASSWORD': '',
        'HOST': '',
        'PORT': '',
    }
}

我们如何防止我们的数据库文件被提交?

4

4 回答 4

13

将您的数据库文件添加到.gitignore. 然后您可以将其保留在当前位置,但它不受版本控制。

于 2013-02-02T19:42:45.593 回答
7

首先,您需要从 git 存储库中删除数据库文件。

git rm <database_file>

为了防止文件被添加到您的存储库,请在您的存储库签出中创建一个名为“.gitignore”的文件,将数据库文件添加到 .gitignore,然后将 .gitignore 添加到您的存储库。(文档

为了防止与 settings.py 发生冲突,我还将 settings.py 添加到 .gitignore。然后我创建一个名为“settings.production.py”的文件,其中包含生产服务器的所有设置,并将其添加到存储库中。在本地结帐时,我只需将此文件复制到 settings.py 并根据需要修改变量。在我的生产服务器上,我创建了 settings.production.py 的符号链接。

ln -s settings.production.py settings.py

警告:

  1. 如果您的存储库是公开的,它不应该存储密钥、密码、证书等。您不希望其他人有权访问这些文件。
  2. 您还应该验证您的 Web 服务器不提供“.git”文件夹。如果可以访问,黑客可以访问您的源代码http://example.com/.git
于 2013-02-02T20:02:36.030 回答
1

当您与其他 ppl 共享存储库一起处理项目时,您必须制作 local_settings.py 并保留所有本地设置:) 然后在 settings.py 中添加from local_settings import *. 并将 local_settings.py 和数据库文件添加到.gitignore文件中。

例如,如果您的文件名database.db在此文件所在的目录中,则创建具有名称的文件.gitignore并写入其中database.db*.db忽略所有 db 文件。

于 2013-02-02T19:44:40.580 回答
1

这是一个常见的问题。我建议不要签入数据库并根据需要加载和保存数据夹具。(https://docs.djangoproject.com/en/dev/howto/initial-data/

创建 test_data 目录并运行以下命令将数据库导出到与数据库无关的 json 文件:./manage.py dumpdata > test_data/test_file_1.json

将该文件签入源。如果您想在任何时候将数据库恢复到该点,只需运行:./manage.py loaddata test_data/test_file_1.json

这也具有用于单元测试的优点(阅读在 django 单元测试中加载固定装置

from django.test import TestCase
class MyTestCase(TestCase):
    fixtures = ['/myapp/fixtures/dump.json',]
于 2013-02-02T21:06:30.767 回答