Хорошо, так что я действительно нашел лучшее решение этой проблемы. Мое предыдущее решение , которое включало второй репозиторий git, быстро стало проблематичным из-за размера файлов sqlite, с которыми я работал;git не может обрабатывать большие файлы.Я исследовал различные способы улучшения способности git обрабатывать файлы (например, git-bigfiles , git-annex ), но, похоже, ничто не могло справиться с моей ситуацией элегантно.
ответ: символические ссылки.
NB Это решение довольно специфично для Unix, но вы, вероятно, сможете переработать его для не-Unix систем.
Проблема № 1: Убедитесьчто данные никогда не отправляются в удаленный репозиторий.
Это было просто.Как и в моем предыдущем решении, я храню данные вне хранилища.
Root-Directory/
My-Project/
.git/
Source-Code-and-Stuff/
My-Project-Data/
A-Big-Sqlite-File.sqlite
Поскольку файлы данных не находятся в хранилище, нет необходимости беспокоиться о том, что они были проиндексированы с помощью git.
Проблема № 2: Разные ветви должны ссылаться на разные версии данных.
Именно здесь в игру вступают символические ссылки.Символьная ссылка - это, по сути, ярлык на файл, поэтому идея заключается в том, чтобы поместить символическую ссылку на файл данных внутри репозитория.Симлинки индексируются с помощью git (и они очень маленькие), поэтому разные ветки могут иметь разные символические ссылки.
Чтобы объяснить это, давайте рассмотрим пример проекта, который имеет текущую живую версию (1.1) для мастер филиал;и новая версия (1.2) в ветке version-1.2 .Для простоты этот проект имеет только один файл данных: Data.sqlite .
Файл данных хранится в каталоге My-Project-Data , упомянутом выше,и поддерживается версия в файловой системе следующим образом:
My-Project-Data/
v1.1/
Data.sqlite
v1.2/
Data.sqlite
Файл данных добавляется в хранилище с помощью символической ссылки:
My-Project/
.git/
Source-Code-and-Stuff/
Data-Symlink.sqlite
В ветви master , Data-Symlink.sqlite - это
../../My-Project-Data/v1.1/Data.sqlite
, а в version-1.2 -
../../My-Project-Data/v1.2/Data.sqlite
Так что при разработке по версии1.3 начинается, следующий скрипт bash установит все:
# Get to the root directory
cd path/to/Root-Directory
# Enter the data directory
cd My-Project-Data
# Make a directory for the new version and enter it
mkdir v1.3
cd v1.3
# Copy the new sqlite file into it
cp ~/path/to/data/file.sqlite Data.sqlite
# Move to the project directory
cd ../../My-Project
# Create a new branch
git checkout -b version-1.3
# Move to the source code directory and delete the current symlink
cd Source-Code-and-Stuff
rm Data-Symlink.sqlite
# Create a symlink to the new data file
ln -s ../../Project-Data/v1.3/Data.sqlite Data-Symlink.sqlite
# Commit the change
cd ../
git add Source-Code-and-Stuff/Data-Symlink.sqlite
git commit -m "Update the symlink"
Заключение
Очевидно, что это не идеальное решение.Если вы работаете с командой, у всех в команде должны быть одинаковые относительные каталоги - символические ссылки - это относительные пути, поэтому абсолютный путь к Root-Directory может измениться, но My-Проект и My-Project-Data должен существовать в нем.Но мое личное мнение заключается в том, что преимущества перевешивают эту незначительную оговорку.В настоящем проекте я использую эту технику, у меня есть файл sqlite объемом 800 МБ для данных, и я могу переключаться между оперативной ветвью и ветвями разработки, и мой проект автоматически обновляет файл данных. Это бесценно.