Git 2.25.0發布,新特性:部分clone與稀疏checkout

2020-12-11 開源中國

Git 2.25.0 發布了,項目貢獻者 Taylor Blau 介紹了此版本帶來的一些特性上的亮點,包括部分克隆(partial clone)與稀疏檢出(sparse checkout)。

partial clone,部分克隆

一般來說,Git clone 時副本會複製倉庫的所有數據,包括歷史記錄中每個文件的每個版本,對於非常大的存儲庫,如果只需要文件的一部分,那會無形中增加網絡傳輸和本地存儲的成本。在過去的幾個版本中,Git 擁有了執行部分克隆的能力,這意味著它現在可以克隆並使用存儲庫部分內容而無需擁有所有內容。

目前該特性還處於實驗階段。

具體來講,部分克隆需要客戶端做兩件事:它必須能夠告訴伺服器它只需要存儲庫中的哪些對象,同時還必須能夠不與缺少完整對象集的本地存儲庫產生衝突。另一方面,伺服器則必須能夠解釋客戶端的請求,僅服務於某些對象,並能夠生成適當的響應。

這其中必要的邏輯是需要 Git 在收到伺服器的響應後能夠跳過檢出存儲庫,因為一旦檢出,那麼它就會發現 clone 的對象不完整,並嘗試向伺服器請求。實際上這一功能由另一個新特性實現:sparse checkout,稀疏檢出。

sparse checkout,稀疏檢出

稀疏檢出實際上是一個類似於 .gitignore 的文件路徑模式匹配列表,告訴 Git 在檢出存儲庫時可以跳過哪些對象,它的工作對象是副本內容,而不像 .gitignore 是索引。

稀疏檢出有一個缺點就是很難指定,比如下邊是為了跳過檢出深度大於等於 2 的文件:

首先,指定 --filter = blob:none 要求伺服器避免向我們發送 blob,隨後使用 --no-checkout 告訴 Git 在檢出存儲庫時跳過 /your/repository/here 這部分,但它實際上還要依賴於.git/info/sparse-checkout中的模式匹配。

Git 2.25 中,通過引入新的 git sparse-checkout 命令,讓這一操作更加簡便。以下是與上邊相同功能的 demo:

$ git clone --filter=blob:none --sparse /your/repository/here repo

該git sparse-checkout命令使用戶可以儘可能輕鬆地進行部分克隆和稀疏檢出,無需將複雜的

.gitignore模式匹配編寫到.git/info/sparse-checkout,git sparse-checkout會直接處理。

git sparse-checkout 可以做四件事:設置(set)要檢出的路徑列表、列印(list)當前列表以及完全啟用(enable)或禁用(disable)稀疏檢出。

要檢出新路徑,只需執行以下命令:

$ git sparse-checkout set /path/to/check/out

此外,對於非常大的倉庫,稀疏檢出模式匹配列表會過於繁雜,Git 現在提供了一種 cone 模式,執行git config core.sparseCheckoutCone進入該模式,允許的模式匹配集將變得更加嚴格,可以直接指定是否在給定子目錄內檢出所有路徑或所有文件,而不是通過 .gitignore 模式匹配。

例如,如果在大型存儲庫中有一個目錄 A/B/C,而 C 是平時執行大部分工作的位置,則它可能需要被完全檢出,但同時還需要讓 A 和 B 檢出足夠多的內容,以便可以到達 C。在 cone 模式下,git sparse-checkout set A/B/C可以做到這一點。

關於 Git 2.25 的更新內容,詳情查看:

https://lore.kernel.org/git/xmqqtv4zjgv5.fsf@gitster-ct.c.googlers.comhttps://github.blog/2020-01-13-highlights-from-git-2-25

相關焦點

  • Git 2.25.0 發布,新特性:部分 clone 與稀疏 checkout
    Git 2.25.0 發布了,項目貢獻者 Taylor Blau 介紹了此版本帶來的一些特性上的亮點,包括部分克隆(partial
  • Git Rev News 61th 閱讀分享
    Git 發布 2.26 版本在美國當地時間2020年3月24日,Git 正式發布 2.26 版本,接下來給大家介紹一下此次版本的更新git protocol version 2 正式成為默認的協議在 Git 協議的第一版中,存在著一個問題,客戶端要發送任何內容的時候,服務端都會及時的列出所有分支、標籤以及一些其他的引用,當倉庫比較大的時候,可能會發送兆字節以上的額外數據,
  • Git入門到高級系列2-git高級操作
    創建分支創建分支:git branch 分支名字命令,切換分支的命令使用 git checkout 分支名字$ git branch dev$ git checkout dev# -b創建分支,checkout是切換分支$ git checkout -b dev
  • Git 2.19發布,我們一起來體驗新功能:range-diff,grep及更多
    本周linux kernel git郵件組發布消息宣布Git最新版本2.19。郵件上說明和上一個版本V2.18.0相比,包含了來自72個貢獻者的769次提交,72人中還有12個是新面孔。可見git開發社區進一步在壯大,新鮮血液在注入。那麼這個新版本帶來了哪些新功能呢,蟲蟲今天帶大家一起體驗一下。
  • CVE-2018-11235:git爆遞歸clone嚴重漏洞致任意代碼執行
    0x00 概述今日git 和git for window相繼發布最新版本Git 2.17.1、Git forWindows 2.17.1主要用於解決git一個嚴重(非史詩級)漏洞CVE-2018-11235。
  • Git 的奇技淫巧
    >git tag -lngit tag <version-number>默認 tag 是打在最近的一次 commit 上,如果需要指定 commit 打 tag:$ git tag -a <version-number> -m "v1.0 發布(描述)" <commit-id>
  • 30分鐘吃掉Git和GitHub常用操作
    -u origin master在github上的項目clone到本地文件git clone https://github.com/XX/XX ..add -Agit commit -m"add readme.txt"#修改覆蓋上一次commit:git commit --amend#先暫存再提交:git commit -a -m"modify readme.txt"示範2:版本回退git reset --hard head^git reset head a23b5#撤銷修改:git checkout -- readme.txt
  • Git命令總結,總結收藏
    clone git+ssh://git@192.168.53.168/VT.git # clone遠程倉庫 git status # 查看當前版本狀態(是否修改) git add xyz # 添加xyz文件至index git add . # 增加當前子目錄下所有更改過的文件至index git commit -m 'xxx' # 提交
  • Git命令的用法小結
    例如新增了5個文件,刪除了2個,修改3個。這些修改信息一次性納入git倉庫中,形成了對工作目錄整體的新的快照。在git中一次提交即對應於新的快照,即可看作一個臨時版本。「提交」總是從緩衝區發出。分支(Branch)分支可以看作一個指針,總是指向一個版本樹中的一個"提交"。分支幫助用戶指示版本樹中的某個分支。
  • 30 分鐘 git 命令入門到放棄
    遠端倉庫到目前為止,我們的操作都是在本地的,它存在於.git文件中。為了能夠協同開發,我們需要把代碼發布到遠端倉庫上。3.克隆倉庫 – git clone放在Github上的開源項目,人們可以看到你的代碼。可以使用 git clone進行下載到本地。
  • 您必須知道的 Git 分支開發規範,附 Git 常用命令大全!
    feature 分支:開發新功能時,以 develop 為基礎創建 feature 分支;分支命名以 feature/ 開頭的為特性分支,命名規則 feature/user_module、 feature/cart_module。release 分支:release 為預上線分支,發布提測階段,會 release 分支代碼為基準提測。
  • Git 常用命令清單筆記
    git clone git://github.com/JSLite/JSLite.js.gitgit clone git://github.com/JSLite/JSLite.js.git mypro #克隆到自定義文件夾git clone [user@]example.com:path/to/repo.git/ #SSH協議還有另一種寫法。
  • 30分鐘教你學會Git
    3.克隆倉庫 – git clone其他人可以看到你放在Github上的開源項目,他們可以用git clone命令下載到本地。$ git clone https://github.com/igeekbar/awesome-project.git本地也會創建一個新的倉庫,並自動將github上的版本設為遠程倉庫。
  • 一學就會的git命令
    git clone <url>  // url 倉庫地址git clone https://github.com/FishStudy520/git-demo.gitgit config (配置用戶信息)配置用戶信息(用戶名和郵箱);
  • 版本管理工具Git,你用對了了嗎?這一招絕對好用
    github一、常用的git命令git clone git@gitlab.com ——克隆遠程倉庫項目代碼git checkout -b new-branch ——創建一個new-branch,直到功能開發完畢6、git add new_file.php ——把開發過程中新建的文件添加進版本管理7、git commit -m '備註' ——提交所有變更8、git checkout test ——切換至測試分支9、git merge develop-branch ——合併新開發的變更到test分支10、git push
  • 一起學習分布式管理工具git
    當執行 git rm --cached <file> 命令時,會直接從暫存區刪除文件,工作區則不做出改變當執行 git checkout . 或者 git checkout -- <file> 命令時,會用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區的改動。當執行 git checkout HEAD .
  • git在項目中的常用命令
    其中.git文件夾中包含了兩個部分,一個是暫存區(Index或者Stage),顧名思義就是暫時存放文件的地方,通常使用add命令將工作區的文件添加到暫存區裡;本地倉庫:.git文件夾裡還包括git自動創建的master分支,並且將HEAD指針指向master分支。
  • Git 必知必會《下》
    上一篇中項目是從現存的Git 庫中clone過來的,這次我們將新構建一個項目,從最初開始。/drwxr-xr-x 1 tdcengineer 197121 0 8月 2 14:54 ..test.py.The file will have its original line endings in your working directorydiff --git a/test.py b/test.pyindex e69de29..6b24a88 100644--- a/test.py+++ b/test.py@@ -0,0 +1,2 @@+print("hello wolrd")+
  • 玩轉Git就這麼簡單!這些常用命令你確定都用過嗎?
    git checkout .或git checkout -- <file>,用暫存區全部或指定的文件替換工作區的文件。這個操作很危險,會清除工作區中未添加到暫存區的改動。git checkout HEAD .或git checkout HEAD <file>,用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區和以及工作區中的文件。
  • 前端面試題:git reset、git revert 和 git checkout 有什麼區別
    三個區的轉換關係以及轉換所使的命令如下圖git reset、git revert 和 git checkout的共同點:來撤銷代碼倉庫中的某些更改。然後是不同點: 先,從 commit 層來說: git reset 可以將個分的末端指向之前的個 commit。然後再下次 git 執垃圾回收的時候,會把這個 commit之後的 commit 都扔掉。