【问题标题】:git merge conflicts with our database file (multiple developers)git merge 与我们的数据库文件冲突(多个开发人员)
【发布时间】:2026-02-12 07:35:01
【问题描述】:

我和一个朋友正在开发一个 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': '',
    }
}

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

【问题讨论】:

    标签: python django git github django-database


    【解决方案1】:

    首先,您需要从 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. 您还应该确认您的 Web 服务器不提供“.git”文件夹。如果http://example.com/.git 可以访问,黑客可以gain access to your source code

    【讨论】:

    • 如果 repo 是公开的,对设置文件进行版本控制可能会导致麻烦(泄露的密钥)。不过答案很好!
    【解决方案2】:

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

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

    将该文件签入源。在任何时候,如果您想将数据库恢复到该点,只需运行: ./manage.py 加载数据 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',]
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • +1,git 就是为了处理这种事情而设计的。您不需要弄乱您的项目即可使其与 SCC 一起使用。
        • @Lattyware:你如何处理必须在 git 设置中的绝对路径?
        • @RafałŁużyński 应该忽略设置文件。 (如果您有一些设置需要共享,而一些设置需要不同,则它们需要位于单独的文件中,但无论如何这都是很好的设计。
        最近更新 更多