git与我们的数据库文件合并冲突(多个开发人员)

时间:2013-02-02 19:37:45

标签: python django git github django-database

一个伙伴和我正在开发一个Django应用程序,并正在使用git(GitHub)。

在我们工作的时候,我们会在我们的网站上制作假帐户,登录并将内容上传到数据库等等,以便进行测试。这是问题所在:每次我们在GitHub上合并分支时,我们都会遇到与数据库文件的合并冲突。当然,这是因为我们的数据库文件在存储库中,并且由于我们单独测试,因此文件的本地副本会有不同的发展。

我想要做的是让数据库文件存储库之外。这样,我们可以合并,并始终保持我们自己的数据库副本运行,独立于其他人的本地副本。

但是,我们的settings.py文件必须是相同的,因此我们无法指定本地路径(即'Users / sgarza62 / Desktop'或'Users / rada / Desktop) 。这是理想的,但settings.py文件是一个共享文件,因此它在存储库的两个副本中都必须相同。

通过以下内容,我们可以避免使用本地路径:

## 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 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:5)

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

git rm <database_file>

要阻止将文件添加到存储库,请在存储库的检出中创建名为“.gitignore”的文件,将数据库文件添加到.gitignore,然后将.gitignore添加到存储库。 (Documentation

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

创建了一个符号链接
ln -s settings.production.py settings.py

警告:

  1. 如果您的存储库是公共存储库,则它永远不应存储密钥,密码,证书等。您不希望其他人访问这些文件。
  2. 您还应验证您的网络服务器是否不提供“.git”文件夹。如果可以访问http://example.com/.git,黑客可以gain access to your source code

答案 2 :(得分:1)

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

例如,如果您的文件名是database.db,那么在使用此文件的目录中创建名为.gitignore的文件,并在其中写入database.db*.db以忽略所有数据库文件

答案 3 :(得分:1)

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

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

检查该文件是否来源。在任何时候,如果你想将数据库恢复到那一点,只需运行: ./manage.py loaddata test_data / test_file_1.json

这也具有用于单元测试的优点(阅读Loading fixtures in django unit tests

from django.test import TestCase
class MyTestCase(TestCase):
    fixtures = ['/myapp/fixtures/dump.json',]