一個基於 Go 語言的 Git 互動式新增功能實現引起了開發者們的關注,不僅因為其增強的功能特性,更因為它在社群中引發了關於是否可能在上游替換 Git 原有 Perl 實現的討論。
這個 Go 語言移植版本重新實現了熟悉的 git add -i
和 git 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 -p
或git 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 實現都突顯了開發者工具的持續演進以及社群對增強、高效工作流程的渴望。