從「Tracking SQLite Database Changes in Git」這邊看到的,然後作者 Simon Willison 又是從 Lobste.rs 的「Tracking SQLite Database Changes in Git databases」這邊看到的,而原文在「Tracking SQLite Database Changes in Git」。
一般 SQLite 檔案的 diff 會出現這樣:
diff --git a/a.sqlite3 b/a.sqlite3 index a4a8cfa..714f34a 100644 Binary files a/a.sqlite3 and b/a.sqlite3 differ
作者想要透過 sqlite3 的指令加工,讓 git-diff 的演算法可以展現出像是這樣的指令:
diff --git a/a.sqlite3 b/a.sqlite3 index a4a8cfa..714f34a 100644 --- a/a.sqlite3 +++ b/a.sqlite3 @@ -3,4 +3,5 @@ BEGIN TRANSACTION; CREATE TABLE tbl (id SERIAL, username TEXT, password TEXT, created_at INT, updated_at INT); INSERT INTO tbl VALUES(NULL,'gslin','$1$yRgoNPev$nOc5Hpr5JZAYISbHjp7LA/',0,0); INSERT INTO tbl VALUES(NULL,'dk','$1$yRgoNPev$nOc5Hpr5JZAYISbHjp7LA/',0,0); +INSERT INTO tbl VALUES(NULL,'darkkiller','$1$yRgoNPev$nOc5Hpr5JZAYISbHjp7LA/',0,0); COMMIT;
方法是先設定 diff 工具部分,這個可以放到 ~/.gitconfig
裡面:
[diff "sqlite3"] binary = true textconv = "echo '.dbconfig trusted_schema no\n.dump' | sqlite3"
這邊跟原文不太一樣,主要是參考了 SQLite 官方網站上「Defense Against The Dark Arts」這邊的「Untrusted SQLite Database Files」部分,增加了 .dbconfig trusted_schema no
的設定加減擋一下...
然後我依照「Where should I place my global 'gitattributes' file?」這邊的問題與解答,把 attributes 設定放在 ~/.config/git/attributes
裡面:
*.sqlite diff=sqlite3 *.sqlite3 diff=sqlite3
這樣就會對這個使用者所有的 git repository 都生效。
作者原文提到的方法也可以用,不過主要是在單一 repository 裡面設定,針對 *.db
這類只有在 repository 內才會知道規則的告訴 git 要怎麼認。