好的,我实际上想到了一个更好的解决方案来解决这个问题。我的先前的解决方案涉及到第二个git存储库,由于我正在处理的sqlite文件的大小,git不能处理大文件,因此很快就出现了问题。我研究了各种改善git处理这些文件的方法(例如git-bigfiles,git-annex),但是没有什么优雅地解决我的情况。
答案:使用符号链接。
N.B.这个解决方案相当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
在
主分支上,
Data-Symlink.sqlite是。
../../My-Project-Data/v1.1/Data.sqlite
在版本1.2分支上,它是这样的
../../My-Project-Data/v1.2/Data.sqlite
所以,当开始1.3版本的开发时,以下Bash脚本将设置所有内容:
cd path/to/Root-Directory
cd My-Project-Data
mkdir v1.3
cd v1.3
cp ~/path/to/data/file.sqlite Data.sqlite
cd ../../My-Project
git checkout -b version-1.3
cd Source-Code-and-Stuff
rm Data-Symlink.sqlite
ln -s ../../Project-Data/v1.3/Data.sqlite Data-Symlink.sqlite
cd ../
git add Source-Code-and-Stuff/Data-Symlink.sqlite
git commit -m "Update the symlink"
结论
显然这不是一个完美的解决方案。如果你在团队中工作,团队中的每个人都需要有相同的相对目录 - 符号链接是相对路径,因此到根目录的绝对路径可能会改变,但我的项目和我的项目数据必须存在于其中。但我个人认为收益超过了这个小缺点。在我正在使用这种技术的实际项目中,我有一个800MB的sqlite文件用于数据,在生产和开发分支之间切换,并使我的项目自动更新数据文件是无价的。