gitbase 是一個使用 go 開發的的開源專案,它實現了在 Git 倉庫上執行 SQL 查詢。
Git 已經成為了程式碼版本控制的事實標準,但儘管 Git 相當普及,對程式碼倉庫的深入分析的工作難度卻沒有因此而下降;而 SQL 在大型程式碼庫的查詢方面則已經是一種久經考驗的語言,因此諸如 Spark 和 BigQuery 這樣的專案都採用了它。
所以,source{d} 很順理成章地將這兩種技術結合起來,就產生了 gitbase(LCTT 譯註:source{d} 是一家開源公司,本文作者是該公司開發者關係副總裁)。gitbase 是一個程式碼即資料的解決方案,可以使用 SQL 對 git 倉庫進行大規模分析。
gitbase 是一個完全開源的專案。它站在了很多巨人的肩上,因此得到了足夠的發展競爭力。下面就來介紹一下其中的一些“巨人”。
gitbase playground 為 gitbase 提供了一個視覺化的操作環境。
gitbase 通過 SQL 與使用者進行互動,因此需要能夠遵循 MySQL 協定來對通過網路傳入的 SQL 請求作出解析和理解,萬幸由 YouTube 建立的 Vitess 專案已經在這一方面給出了解決方案。Vitess 是一個橫向擴充套件的 MySQL 資料庫叢集系統。
我們只是使用了這個專案中的部分重要程式碼,並將其轉化為一個可以讓任何人在數分鐘以內編寫出一個 MySQL 伺服器的開源程式,就像我在 justforfunc 視訊系列中展示的 CSVQL 一樣,它可以使用 SQL 操作 CSV 檔案。
在成功解析 SQL 請求之後,還需要對資料集中的 git 倉庫進行查詢才能返回結果。因此,我們還結合使用了 source{d} 最成功的 go-git 倉庫。go-git 是使用純 go 語言編寫的具有高度可延伸性的 git 實現。
藉此我們就可以很方便地將儲存在磁碟上的程式碼倉庫儲存為 siva 檔案格式(這同樣是 source{d} 的一個開源專案),也可以通過 git clone
來對程式碼倉庫進行複製。
gitbase 整合了我們開源的語言檢測專案 enry 以及程式碼解析專案 babelfish,因此在分析 git 倉庫歷史程式碼的能力也相當強大。babelfish 是一個自託管服務,普適於各種原始碼解析,並將程式碼檔案轉換為通用抽象語法樹(UAST)。
這兩個功能在 gitbase 中可以被使用者以函數 LANGUAGE
和 UAST
呼叫,諸如“查詢上個月最常被修改的函數的名稱”這樣的請求就需要通過這兩個功能實現。
gitbase 可以對非常大的資料集進行分析,例如來自 GitHub 高達 3 TB 原始碼的 Public Git Archive(公告)。面臨的工作量如此巨大,因此每一點效能都必須運用到極致。於是,我們也使用到了 Rubex 和 Pilosa 這兩個專案。
Rubex 是 go 的正規表示式標準庫包的一個準替代品。之所以說它是準替代品,是因為它沒有在 regexp.Regexp
類中實現 LiteralPrefix
方法,直到現在都還沒有。
Rubex 的高效能是由於使用 cgo 呼叫了 Oniguruma,它是一個高度優化的 C 程式碼庫。
索引幾乎是每個關係型資料庫都擁有的特性,但 Vitess 由於不需要用到索引,因此並沒有進行實現。
於是我們引入了 Pilosa 這個開源專案。Pilosa 是一個使用 go 實現的分散式點陣圖索引,可以顯著提升跨多個大型資料集的查詢的速度。通過 Pilosa,gitbase 才得以在巨大的資料集中進行查詢。
我想用這一篇文章來對開源社群表達我衷心的感謝,讓我們能夠不負眾望的在短時間內完成 gitbase 的開發。我們 source{d} 的每一位成員都是開源的擁護者,github.com/src-d 下的每一行程式碼都是見證。
你想使用 gitbase 嗎?最簡單快捷的方式是從 sourced.tech/engine 下載 source{d} 引擎,就可以通過單個命令執行 gitbase 了。
想要了解更多,可以聽聽我在 Go SF 大會上的演講錄音。
本文在 Medium 首發,並經許可在此發布。