以下是问题所在:
我在我的托管合作伙伴的地方创建了裸露的git仓库,我使用它作为我维护项目的所有位置/计算机的参考仓库。
问题是,我的项目使用的是sqlite db文件,它一直在定期增长(目前大约是150MB )。随着时间的推移,我的.git文件夹变得越来越大(最近大约1 1GB)。而且我的托管空间是有限的。
我需要裸存储库来包含这个db文件的头版本,但是我真的不需要保存它的版本历史。
因此,为了获得一些空间,我不时地从历史记录中删除db文件,清理存储库并重新创建裸版本。这是可行的,但也是相当痛苦的。
有没有办法告诉git只保留文件的最新版本并删除其历史记录?
发布于 2010-02-12 21:21:59
简短的回答是:不。
更有用的答案: Git不会单独跟踪文件,因此要求它丢弃单个文件的历史记录将意味着它必须在每次提交时完全重写其所有历史记录,这会导致各种丑陋的问题。
您可以将文件存储在带注释的标记中,但这不是很方便。它基本上是这样的:
ID=`git hash-object -w yourfile.sqlite`
git tag -a -m "Tag database file" mytag $ID
这绝对不能方便地更新(甚至创建)工作树中的数据库文件...你必须使用钩子脚本来模拟它。
完全公开:我不能完全确定是否真的有可能推送正常历史记录中未涵盖的标记斑点。我怀疑它不是,在这种情况下,这个食谱将是非常不有用的。
发布于 2010-02-12 21:25:40
听起来你好像找错了问题的解决方案。
大型二进制文件经常需要存储在存储库中,但我认为SQLite数据库并不是真正需要以二进制形式存储在存储库中的东西。
相反,您应该将模式保持在版本控制中,如果还需要保留数据,则将其序列化(到XML、JSON、YAML...)版本也是如此。构建脚本可以创建数据库,并在必要时将数据反序列化到其中。
因为Git可以有效地跟踪基于文本的序列化格式,所以即使您认为不需要访问以前的版本,也不必担心保留这些版本的空间开销。
发布于 2012-05-05 07:09:16
将sqlite.db添加到您的.gitignore。
要使用当前分支签入(潜在)推送的当前数据库,请执行以下操作:
branch="$(sed 's,.*refs/heads/,,' "$(git rev-parse --git-dir)"/HEAD)"
objectname=$(git hash_object -w "$(git rev-parse --show-toplevel)/sqlite.db")
git tag -f db_heads/$branch $objectname
推送分支时:
git push origin $branch +db_heads/$branch
获取分支时:
git fetch origin $branch tags/db_heads/$branch:tags/db_heads/$branch
检出分支时:
git checkout $branch
git cat-file -p db_heads/$branch >"$(git rev-parse --show_toplevel)/sqlite.db"
我想,这应该就够了。
https://stackoverflow.com/questions/2251967
复制相似问题