Git 互動式新增功能的 Go 語言實現引發上游整合討論

BigGo Editorial Team
Git 互動式新增功能的 Go 語言實現引發上游整合討論

一個基於 Go 語言的 Git 互動式新增功能實現引起了開發者們的關注,不僅因為其增強的功能特性,更因為它在社群中引發了關於是否可能在上游替換 Git 原有 Perl 實現的討論。

這個 Go 語言移植版本重新實現了熟悉的 git add -igit add -p 命令,同時添加了幾個強大的增強功能。這些功能包括使用正則表示式模式對所有檔案進行全域性過濾、自動程式碼塊分割,以及可以一次性接受所有匹配程式碼塊的批次操作。該工具與 Git 現有的顏色配置保持完全相容,並支援所有主要的補丁模式。

相比原始 Perl 版本的增強命令:

  • G <regex> - 使用正則表示式模式對所有檔案進行全域性過濾
  • G - 清除過濾器並互動式提示輸入新模式
  • S - 自動拆分以在全域性範圍內啟用最大粒度
  • A - 在過濾和拆分後接受所有檔案中的所有程式碼塊

社群對上游整合的興趣

特別有趣的是,社群立即關注如何將這個實現整合到 Git 的主程式碼庫中。一位開發者直接詢問作者為什麼沒有將其提交到 Git 郵件列表以供上游考慮。這個問題突顯了開發者社群的一個普遍願望,即希望看到現代化的增強工具替換核心軟體中的舊實現。

然而,上游整合的現實情況更加複雜。Git 專案對新依賴項的保守態度意味著新增 Go 作為要求將面臨重大阻力。正如一位評論者指出的,這需要大量努力來讓維護者們就引入新語言達成一致,類似於在 Linux 核心中新增 Rust 時面臨的挑戰。

建議直接用 C 語言重寫的想法展現了對此類情況的典型回應,儘管這遠不止是簡單的語言轉換。該實現需要與 Git 現有的補丁生成系統整合,並在所有支援的平臺上保持相容性。

增強的工作流程能力

Go 實現的突出功能解決了實際工作流程中的痛點。全域性過濾系統允許開發者快速定位整個變更集中特定型別的更改。例如,過濾 TODO 註釋或 console.log 語句可以幫助開發者將相關更改一起暫存,無論這些更改位於哪些檔案中。

自動分割功能將 Git 現有的程式碼塊分割能力發揮到極致,自動將更改分解到最精細的粒度。結合批次接受功能,這創造了原始 Perl 實現無法實現的強大工作流程組合。

支援的補丁模式:

  • 暫存模式:git add -pgit add --patch
  • 重置模式:git reset -p
  • 檢出模式:git checkout -p
  • 貯藏和工作樹操作
  • 所有模式都支援增強的過濾和拆分功能

替代工具和生態系統

討論還揭示了開發者依賴的 Git 增強工具的多樣化生態系統。幾位社群成員提到了他們偏好的替代方案,包括用於基於終端的 Git 操作的老牌工具 tig 和用於增強暫存工作流程的 scmpuff。這表明雖然標準的 Git 工具可以工作,但顯然有人渴望改善使用者體驗。

作者關於在2045年重新考慮上游整合的幽默回應反映了對 Git 核心功能進行重大更改的現即時間表,同時仍然表達了最終替換上游版本的真誠興趣。

安裝方法:

  • 直接構建:go build
  • 作為 Git 命令安裝:go build -o "$(go env GOPATH)/bin/git-add-interactive"
  • 新增到 Git 執行路徑:export GIT_EXEC_PATH="$(go env GOPATH)/bin:$GIT_EXEC_PATH"
  • 驗證:which git-add-interactive 並使用 git add -i 進行測試

展望未來

這個專案不僅僅是另一個 Git 工具——它展示了現代實現如何在保持相容性的同時增強熟悉的工作流程。社群對上游整合的即時興趣表明,確實有真正的需求希望這些改進能夠惠及所有 Git 使用者,而不僅僅是那些願意安裝額外工具的使用者。

無論是透過最終的上游採用還是作為獨立工具的持續開發,這個 Go 實現都突顯了開發者工具的持續演進以及社群對增強、高效工作流程的渴望。

參考:Git Add Interactive (Go Implementation)