好的,所以我实际上想出了一个更好的解决方案来解决这个问题。 My previous solution 涉及第二个 git 存储库,由于我正在使用的 sqlite 文件的大小,它很快就出现了问题; git 无法处理大文件。我研究了各种方法来提高 git 处理文件的能力(例如git-bigfiles、git-annex),但似乎没有什么能优雅地处理我的情况。
答案:符号链接。
注意这个解决方案是 Unix 特有的,但您可能可以为非 Unix 系统重新设计它。
问题 #1:确保数据从不发送到远程存储库。
这个很简单。与我之前的解决方案类似,我将数据存储在存储库之外。
Root-Directory/
My-Project/
.git/
Source-Code-and-Stuff/
My-Project-Data/
A-Big-Sqlite-File.sqlite
由于数据文件不在存储库中,因此无需担心它们会被 git 索引。
问题 #2:不同的分支应该引用不同版本的数据。
这就是符号链接发挥作用的地方。符号链接实际上是文件的快捷方式,因此想法是将符号链接放入存储库中的数据文件。符号链接由 git 索引(它们非常小),因此不同的分支可以有不同的符号链接。
为了解释这一点,让我们以一个示例项目为例,该项目在 master 分支上有一个当前运行的版本 (1.1);以及 version-1.2 分支上的新版本 (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 -Project 和 My-Project-Data 必须 存在于其中。但我个人的观点是,好处超过了这个小警告。在实际项目中,我正在使用这种技术,我有一个 800MB 的 sqlite 数据文件,能够在实时和开发分支之间切换并让我的项目自动更新数据文件是无价的。