我有一个存储在SQLite数据库中的日志文件,我想在git存储库中分发.
稍后我想将日志文件的更改自动与原始文件合并.
这会起作用吗?将自动二进制文件合并到SQLite文件中会更频繁地爆炸吗?
smo*_*fra 17
您需要在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
Run Code Online (Sandbox Code Playgroud)
在.gitattributes中:
signons.sqlite diff=sqlite3 merge=sqlite3
Run Code Online (Sandbox Code Playgroud)
在你的路径的某个地方,名为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 $@;
}
Run Code Online (Sandbox Code Playgroud)
也在你的路径中,命名为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 $@;
}
Run Code Online (Sandbox Code Playgroud)
我现在就把它们搞砸了,现在你可能不得不解决这些问题.
请参阅: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
Run Code Online (Sandbox Code Playgroud)
可以创建重新创建数据库所需的所有sql语句,然后你对转储文件做东西,然后创建一个sqlite数据库
sqlite3 newdatabase.db < modified_dump_file.txt
Run Code Online (Sandbox Code Playgroud)
你应该能够使用某种git hook自动化它(我不太熟悉git).
| 归档时间: |
|
| 查看次数: |
6489 次 |
| 最近记录: |