本週linux kernel git郵件組發佈消息宣佈Git最新版本2.19。郵件上說明和上一個版本V2.18.0相比,包含了來自72個貢獻者的769次提交,72人中還有12個是新面孔。可見git開發社區進一步在壯大,新鮮血液在注入。那麼這個新版本帶來了哪些新功能呢,蟲蟲今天帶大家一起體驗一下。
range-diff歷史對比
首先我們介紹下git range-diff 這是 2.19新加入的功能,用來比較兩個commit序列的工具,包括對它們的順序的更改,commit消息以及它實際內容更改。我們可能都熟悉git diff,用來比較連個commit之間的差異,但是隻提供連個狀態直接差異,沒有相關序列的變化,如果功過rebase做了修改,可能狀態會大不一樣,而range-diff則是能反應所有這些變化。
比如上面實例,我們的整個git結構如做面所以,右面顯示了我們對兩條分支序列對比的差異。由右上到右下分別為:基於分支4 兩個commit對比。中間位兩條commits路線的差異;右下為基於分支master分支的對比。中間的對比反應了其他兩個基礎上分支的差異。
git grep新功能
使用git grep搜索關鍵字時候,如果能顯示搜索到信息的相關的信息(比如行號和函數上下文)通常會很有意義。
在Git 2.19新版本中可以使用git grep --column找到查詢的第一個匹配列。
如果使用Vim,還可以嘗試git-jump,這是一個Git插件,可以將代碼中的有用位置轉換為文本編輯器中的跳轉位置。 git-jump可以讓你合併衝突,差異,你可以使用git grep --column來確定grep位置。
git grep添加了新的-o選項(意思是--only-matching)。添加-o後搜索結果只會顯示匹配的語句,而不顯示整行,比如上面的結果加-o後結果:
分支排序
git branch命令,git標籤(以及對應的指針類對象git for-each-ref),可以使用--sort選項就能通過許多屬性對結果進行排序。例如,要按最近更新的順序顯示分支,可以使用git branch -sort=-authordate。但是如果你時常有排序的需求,則手動輸入排序選項會有點費勁。
新版下,則給出了另外一個選擇:使用branch.sort配置來設置git分支的默認順序:
請注意,默認情況下,git branch按引用名排序,因此開頭是4,最後是master。在上面的例子中,我通過設置branch.sor為最近更新分支排序,設置後默認顯示效果和--sort的語句效果一樣。
可以使用的其他排序選項有:
--sort = numparent通過它們的熱門程度顯示合併
--sort = refname按名稱的字母順序對分支進行排序(這是默認設置)
--sort = upstream通過它們所源自的遠程對分支進行排序
更多新功能
在Git v2.18中,修復了.gitmodules中的遠程執行代碼漏洞,當受害者使用--recurse-submodules克隆時,攻擊者可以執行腳本。對應系列安全補丁版本為v2.17.1,v2.16.4,v2.15.2,v2.14.4和v2.13.7,非這些版本號的都有安全隱患,建議趕快升級,有關該漏洞蟲蟲有專門文章介紹過,關注蟲蟲可以從歷史文章中看到。
git 命令補全現在更有效,可以自動補全大多數的命令選項(包括命令列表本身,配置選項的名稱等等)。
gpg簽名和驗證提交和標籤已經擴展到與gpgsm一起使用,gpgsm使用X.509證書而不是OpenPGP密鑰。對於集中式證書管理更容易。
許多Git的命令是彩色顯示的,比如git diff,git status等等。從2.17開始,更多的命令也開始支持著色。 git blame會根據年齡或群體來著色;從遠程服務器交互的消息會基於其關鍵字(例如,"錯誤","警告"等)著色。例如push錯誤現在顯示大紅色以增加可見性。
如果你有過使用遠程分支的名稱運行git checkout,你可能知道git會自動創建一個跟蹤遠程分支的本地分支。但是,如果在多個遠程庫對應該分支名稱,Git不知道使用哪個,會放棄任務。
在新版本中,git可以通過checkout.defaultRemote配置,這樣在發生歧義時指定了默認的遠程。
git將某些文本編碼(例如UTF-16)解釋為二進制,git diff類似的工具不會顯示文本差異。通常建議將文本文件存儲為UTF-8,如果其他工具生成或必須用其他編碼,就會有問題。
新版本支持通過設置working-tree-encoding屬性,基於每個文件對git設置你的編碼。這將git會在內部將文件存儲為UTF-8,在轉到你工作區時候,會自動轉換回你設置的編碼。所以git diff和託管Web上表現都不會亂碼。
功能展望
有很多功能目前開始有一些實現,會在未來的版本中會正式發佈,我們在此首先展望一下。
部分克隆
git分佈式設計的一個重要部分是所有clone都能獲得項目的完整歷史記錄,使所有clone都是真正的對等體。當存儲庫中沒有大量對象時,clone會很快完成,當倉庫對象很多時候,clone非常緩慢。
新版本中,可以允許省略某些blob和tree對象的"部分"克隆,以支持根據需要再從服務器請求對象。該功能目前還是實驗階段,大多數公共服務器還不支持該功能。
提交圖表
git有一個非常簡單的k-v數據結構:一切都是以其內容的哈希為命名的value對象,並且這些對象通過這些名稱相互引用。許多操作都是遍歷由這些指針形成的圖形。例如,果你想知道"哪些版本修復了這個X錯誤",實際上是"哪些tag對象的路徑可以引用到該commit X"(其中X是修復上述錯誤的提交)。
通常,需要遍歷這些路徑,需要從磁盤加載每個對象以找到它的指針。但是現在git可以以更有效的格式計算和存儲每個commit屬性,從而顯著加快遍歷速度。
git v2協議
截止目前,git仍然使用與2005年開發的大致相同的協議:在客戶端連接之後,服務器轉儲所有分支和標籤的當前狀態(稱為"ref 文件"),然後客戶端詢問它需要的部分更新。隨著存儲庫的增長,這種ref的成本已成為效率低下的根源。
多年來,該協議通過協商服務器和客戶端之間的功能,以向後兼容的方式添加了新功能。
現在有一個新的協議解決了這個問題(以及更多),提供了一種更有效地傳輸廣告的方法。到目前為止,只有少數服務器支持新協議。
從SHA-1算法過度
我們知道git對象都是根據其內容的哈希命名的。而計算哈希值的算法目前用的SHA-1,這在一段時間內一直沒有被認為是安全的。但是現在情況變化了,去年就發現併發布了一次針對SHA-1碰撞攻擊。所以這個算法變的不在可靠,雖然git中SHA-1衝突發生有點不太可能,但是git項目已經計劃使用更安全的SHA-256來取代SHA-1算法了。
好了關於git新功能的嚐鮮,蟲蟲就介紹到這裡,更多信息請詳細查閱官方文檔,並且自己動手安裝新版本。有什麼問題歡迎關注蟲蟲,我們一起探討。
閱讀更多 蟲蟲安全 的文章