一个伙伴和我正在开发一个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': '',
}
}
我们如何将数据库文件保存在存储库之外?
答案 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
警告:强>
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',]