소개
gitsqlite는 SQLite 데이터베이스를 평문 SQL 텍스트로 변환해 Git에서 의미 있는 diff와 merge가 가능하도록 돕는 Git clean/smudge/diff 필터입니다. danielsiegl 저장소에서 BSD-2-Clause 라이선스로 공개된 Go 기반 도구이며, .sqlite 파일을 체크아웃과 커밋 시 자동으로 SQL 텍스트와 바이너리 간 변환합니다. winget, Debian 패키지, 직접 바이너리 다운로드 등 다양한 배포 경로를 제공해 Windows, Linux, macOS 환경에서 조직 단위로 손쉽게 도입할 수 있도록 설계되었습니다.
상세정보
clean/smudge 자동 변환
clean 필터는 커밋 시점에 SQLite 바이너리를 평문 SQL 덤프로 변환하고, smudge 필터는 체크아웃 시점에 SQL 덤프를 다시 바이너리 DB로 복원합니다. 이 과정을 통해 Git 저장소에는 항상 사람이 읽을 수 있는 SQL 텍스트가 저장됩니다.
SQL 기반 diff 지원
diff 명령은 SQLite 바이너리를 입력받아 SQL 덤프를 stdout으로 흘려보내므로, Git diff에서 두 데이터베이스의 구조와 데이터 차이를 텍스트로 비교할 수 있습니다.
크로스 플랫폼 결정적 덤프
Windows/Linux/macOS 환경에서 byte-for-byte 동일한 결과가 나오도록 설계됐으며, 일관된 부동소수점 반올림을 적용해 diff 노이즈를 줄입니다. 또한 SQLite의 내부/시스템 테이블은 덤프에서 제외됩니다.
스키마/데이터 분리 모드
`-data-only`, `-schema`, `-schema-file` 옵션을 사용하면 스키마와 데이터를 별도 파일로 분리해 관리할 수 있어, 변경 사항이 데이터 행(INSERT/UPDATE/DELETE)에만 집중되는 깔끔한 diff를 얻을 수 있습니다.
데이터 무결성 검증
clean 단계에서 SQL 내용에 대한 SHA-256 해시를 주석으로 첨부하며, smudge 단계에서 이를 검증합니다. 기본 모드에서는 검증 결과를 로그로 남기고 계속 진행하고, `-verify-hash` 플래그를 사용하면 해시가 없거나 잘못된 경우 작업을 즉시 중단합니다.
로깅과 진단 옵션
`-log` 또는 `-log-dir ` 옵션으로 현재 디렉터리나 지정한 경로에 상세 로그를 기록해 문제 추적과 성능 모니터링에 활용할 수 있습니다.
smudge 결과로 만든 DB가 깨졌다고 표시됩니다.
입력이 유효한 SQL인지 sqlite3 :memory: < input.sql로 확인하고, 지원되지 않는 확장 기능이나 pragma가 포함돼 있지 않은지 점검한 뒤, 문제가 지속되면 -log 옵션으로 상세 로그를 확인합니다.
winget으로 설치했는데도 sqlite3를 못 찾습니다.
winget 설치 시에는 sqlite3가 자동으로 포함되지 않을 수 있습니다. README에서는 winget install SQLite.SQLite 또는 sudo apt install sqlite3로 별도 설치를 안내하며, 시스템 PATH에 다른 버전이 있다면 -sqlite /path/to/sqlite3로 직접 경로를 지정할 수 있습니다.
diff 명령은 어떻게 사용하나요?
diff는 파일 이름을 인수로 받아 SQL 덤프를 stdout으로 출력합니다. 예: gitsqlite diff database.db. 두 DB의 차이를 비교하려면 각각 old.sql, new.sql로 출력한 뒤 diff -u old.sql new.sql를 사용합니다.
라이선스는 무엇인가요?
BSD-2-Clause 라이선스로 배포되며, 원작자 Fredrik Ehnbom과 현재 유지보수자 Daniel Siegl 표기가 LICENSE 파일에 함께 기록돼 있습니다.
시스템 요구사항
- `sqlite3` CLI가 PATH에 존재해야 함(또는 `-sqlite` 플래그로 경로 지정).
- 소스에서 빌드할 경우 Go 1.21 이상 필요.


