2009-02-15 16 views
6

मेरे पास एक SQLite डेटाबेस में संग्रहीत एक लॉग फ़ाइल है जिसे मैं एक गिट भंडार में वितरित करना चाहता हूं।गिट विलय के साथ SQLite तालिका

बाद में मैं मूल फ़ाइल के साथ स्वचालित रूप से विलय करने के लिए लॉग फ़ाइल में परिवर्तन करना चाहता हूं।

क्या यह काम करने जा रहा है? एक SQLite फ़ाइल में स्वचालित बाइनरी विलय अधिक बार नहीं उड़ाएगा?

+1

यह वास्तव में मर्ज हो जाएगा? यही है, फाइल दो अलग-अलग शाखाओं पर अलग-अलग बदल जाएगी? –

उत्तर

6

मुझे विश्वास नहीं है कि गिट वास्तव में आपके काम के लिए उपकरण है। गिट एक वितरित स्रोत कोड प्रबंधन उपकरण है, डेटाबेस प्रतिकृति उपकरण नहीं।

एकमात्र स्वचालित विलय जो गिट प्रयास करेगा, टेक्स्ट फ़ाइलों का विलय हो रहा है। एक लॉग फ़ाइल (आमतौर पर) एक टेक्स्ट फ़ाइल होती है, तो इसे सीधे गिट में क्यों न रखें और डेटाबेस में पहले नहीं?

+0

सुझाव के लिए धन्यवाद। –

5

मुझे संदेह है कि किसी भी सामान्य संस्करण नियंत्रण प्रणाली (गिट, एसवीएन, सीवी, इत्यादि) आपके द्वारा वर्णित तरीकों से डेटाबेस को संभाल सकता है। यदि आप विलय डेटाबेस के लिए गिट का उपयोग करने पर जोर देते हैं, तो आपकी सबसे अच्छी शर्त डेटाबेस को टेक्स्ट फ़ाइल में परिवर्तित करना, टेक्स्ट फ़ाइल मर्ज करना और डेटाबेस को फिर से बनाना है। उदाहरण के लिए,

sqlite3 .dump > dump_file.txt 

के लिए आवश्यक सभी एसक्यूएल बयान बना सकते हैं डेटाबेस फिर से बनाने के लिए, तो आप फेंक दिया फाइल करने के लिए सामान करते हैं, तो

sqlite3 newdatabase.db < modified_dump_file.txt 

के साथ एक SQLite डेटाबेस बनाने के लिए आप में सक्षम होना चाहिए कुछ प्रकार के गिट हुक (मैं गिट से बहुत परिचित नहीं हूं) का उपयोग करके इसे स्वचालित करें।

1

सामान्य मामले में बाइनरी फ़ाइलों को सही तरीके से मर्ज करने का कोई तरीका नहीं है, इसलिए गिट इसे नहीं कर सकता और नहीं करेगा।

कुछ प्रयासों के साथ, आप संस्करण डेटाबेस डंप के लिए गिट का उपयोग कर सकते हैं, लेकिन बहुत ही साधारण मामलों को छोड़कर आपको सीधे डंप का उपयोग करने से अधिक करना होगा। आपको कम से कम अपने कुंजी कॉलम के आधार पर डंप किए गए पंक्तियों को क्रमबद्ध करने के तरीके के बारे में सोचना होगा। अन्यथा आपको नकली संघर्ष मिलेगा, या विलय हो जाएगा जो एक कचरा डेटाबेस का प्रतिनिधित्व करने वाले वाक्य रचनात्मक रूप से वैध डंप उत्पन्न करते हैं।

F.ex., यदि एक ही कुंजी के साथ पंक्ति के विभिन्न संस्करण डंप के विभिन्न संस्करणों के विभिन्न पंक्ति क्षेत्रों में दिखाई देते हैं, तो गिट को लगता है कि उन्हें दोनों को रखना उचित होगा। परिणामी डंप में एक ही पंक्ति के दो प्रस्तुतियां होंगी, जो बकवास है।

संक्षेप में, आप शायद स्रोत नियंत्रण प्रणाली का उपयोग कर डेटाबेस को बनाए रखने की कोशिश करने से नाखुश होंगे।

17

आपको अपने गिट कॉन्फ़िगरेशन में कस्टम विलय और diff ड्राइवरों को परिभाषित करने की आवश्यकता है, और उसके बाद उन्हें फ़ाइलों के साथ संबद्ध करने के लिए विशेषताओं का उपयोग करें।

यह सिर्फ डंप पर एक साधारण पाठ विलय करता है, इसलिए यह कुल बकवास का उत्पादन कर सकता है। आपको यह सुनिश्चित करने के लिए पूरी तरह से अपने काम की जांच करनी होगी कि यह सही बात है हालांकि यह आसान विलय से टेडियम लेना चाहिए।

अपने .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 

और कहीं अपने पथ में, अंतर-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 [email protected]; 
} 
भी अपने रास्ते में

, नामित मर्ज-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 [email protected]; 
} 

मैं बस अभी इन हैक की गई नाम है, अब आपको कंकों को लोहे से बाहर करना पड़ सकता है।

देखें: http://git-scm.com/docs/gitattributes और http://git-scm.com/docs/git-config

+0

यह बहुत अच्छा है! धन्यवाद, @ smoofra! बहुत उपयोगी! – lindes

1

मैं खोल स्क्रिप्ट में ऊपर diff ड्राइवर reimplemented और पाया कि यह सभी मामलों में ठीक से काम नहीं करता है। स्क्रिप्ट पहले दो मापदंडों diff के लिए फ़ाइलों को देना मान लिया गया है, लेकिन man git स्क्रिप्ट को दिए गए मापदंडों के अनुसार कर रहे हैं:

पथ पुराने फ़ाइल पुराने हेक्स पुराने मोड नई फ़ाइल नए हेक्स नया मोड

यहाँ diff है कि यह मेरे लिए किया है:

#!/bin/sh 

FILE_PATH=$1 
OLD_FILE=$2 
OLD_HEX=$3 
OLD_MODE=$4 
NEW_FILE=$5 
NEW_HEX=$6 
NEW_MODE=$7 

A=`tempfile` 
B=`tempfile` 
test -f ${A} && test -f ${B} || exit 1 

sqlite3 ${OLD_FILE} .dump > ${A} && 
sqlite3 ${NEW_FILE} .dump > ${B} && 
diff -u ${A} ${B} --label "${FILE_PATH}@${OLD_HEX}" --label "${FILE_PATH}@${NEW_HEX}" 

rm ${A} 
rm ${B} 
2

हालांकि इस प्रश्न पूछा गया था 8 साल पहले, मैं करता है कि आप के लिए वास्तव में क्या कह रहे हैं एक उपकरण जारी किया है। यह स्क्लाइट प्रोजेक्ट टूल 'sqldiff', यूयूआईडी प्राथमिक कुंजी के रूप में लीवरेज करने वाले कस्टम डिफ ड्राइवर का उपयोग करता है, और स्क्लाइट रोटीड को छोड़ देता है। यह अभी भी अल्फा में है इसलिए प्रतिक्रिया की सराहना की जाती है।

https://github.com/cannadayr/git-sqlite

संबंधित मुद्दे