我有一个存储在SQLite数据库中的日志文件,我想在git存储库中分发.
稍后我想将日志文件的更改自动与原始文件合并.
这会起作用吗?将自动二进制文件合并到SQLite文件中会更频繁地爆炸吗?
您需要在git config中定义自定义合并和差异驱动程序,然后使用属性将它们与文件相关联.
这只是在转储上进行简单的文本合并,因此它可以很好地产生完全无意义.你绝对需要检查它的工作以确保它做正确的事情 它应该从简单的合并中解脱.
在你的.git/config中:
[merge "sqlite3"] name = sqlite3 merge driver driver = merge-sqlite3 %O %A %B [diff "sqlite3"] name = sqlite3 diff driver command = diff-sqlite3
在.gitattributes中:
signons.sqlite diff=sqlite3 merge=sqlite3
在你的路径的某个地方,名为diff-sqlite3
#!/usr/bin/perl -w use File::Temp qw/ :POSIX /; use IPC::Run qw/run/ ; @ARGV == 7 or die sprintf 'wtf %s', join(' ', @ARGV); my ($name, $x, $y) = ($ARGV[0], $ARGV[1], $ARGV[4]); my ($a, $b); eval { $a = tmpnam(); $b = tmpnam(); run ['sqlite3', $x, '.dump'], '>', $a or die 'sqlite3 failed'; run ['sqlite3', $y, '.dump'], '>', $b or die 'sqlite3 failed'; print "diff-sqlite3 a/$name b/$name\n"; run ['diff', '-u', $a, $b, '--label', "a/$name", '--label', "b/$name"], '>', \*STDOUT; unlink $a; unlink $b; 1; } or do { unlink $a if defined $a; unlink $b if defined $b; die $@; }
也在你的路径中,命名为merge-sqlite3
#!/usr/bin/perl -w use File::Temp qw/ :POSIX /; use IPC::Run qw/run/ ; @ARGV == 3 or die sprintf 'wtf %s', join(' ', @ARGV); my ($o, $a, $b) = @ARGV; print "MERGEING SQLITE FILES $o $a $b\n"; eval { $ad = tmpnam(); $bd = tmpnam(); $od = tmpnam(); run ['sqlite3', $o, '.dump'], '>', $od or die 'sqlite3 failed'; run ['sqlite3', $a, '.dump'], '>', $ad or die 'sqlite3 failed'; run ['sqlite3', $b, '.dump'], '>', $bd or die 'sqlite3 failed'; run ['merge', $ad, $od, $bd] or do { my $newname = "$a.dump"; my $n = 0; while (-e $newname) { ++$n; $newname = "$a.dump.$n"; } print "merge failed, saving dump in $newname\n"; rename $ad, $newname; undef $ad; die 'merge failed'; }; unlink $a or die $!; my $err; run ['sqlite3', $a], '>', \*STDOUT, '2>', \$err, '<', $ad; if ('' ne $err) { print STDERR $err; die 'sqlite3 failed'; } unlink $ad if defined $ad; unlink $bd; unlink $od; 1; } or do { unlink $ad if defined $ad; unlink $bd if defined $bd; unlink $od if defined $od; die $@; }
我现在就把它们搞砸了,现在你可能不得不解决这些问题.
请参阅:http://git-scm.com/docs/gitattributes和http://git-scm.com/docs/git-config
我不相信git真的是你工作的工具.git是一个分布式源代码管理工具,而不是数据库复制工具.
git将尝试的唯一自动合并是合并文本文件.日志文件(通常)是一个文本文件,为什么不直接将它放入git而不是先放入数据库?
我怀疑任何通用版本控制系统(git,svn,cvs等)都能以你描述的方式处理数据库.如果你坚持使用git来合并数据库,最好的办法是将数据库转换为文本文件,合并文本文件,然后重新创建数据库.例如,
sqlite3 .dump > dump_file.txt
可以创建重新创建数据库所需的所有sql语句,然后你对转储文件做东西,然后创建一个sqlite数据库
sqlite3 newdatabase.db < modified_dump_file.txt
你应该能够使用某种git hook自动化它(我不太熟悉git).