簡體中文 ▾ 主題 ▾ 最新版本 ▾ scalar 最後更新於 2.53.0

名稱

scalar - 管理大型 Git 倉庫的工具

概要

scalar clone [--single-branch] [--branch <main-branch>] [--full-clone]
	[--[no-]src] [--[no-]tags] [--[no-]maintenance] <url> [<enlistment>]
scalar list
scalar register [--[no-]maintenance] [<enlistment>]
scalar unregister [<enlistment>]
scalar run ( all | config | commit-graph | fetch | loose-objects | pack-files ) [<enlistment>]
scalar reconfigure [--maintenance=(enable|disable|keep)] [ --all | <enlistment> ]
scalar diagnose [<enlistment>]
scalar delete <enlistment>

描述

Scalar 是一個倉庫管理工具,旨在最佳化 Git 在大型倉庫中的使用。Scalar 透過配置高階 Git 設定、在後臺維護倉庫以及減少透過網路傳送的資料來提高效能。

Scalar 的一個重要概念是登記 (enlistment):這是專案的頂層目錄。它通常包含一個名為 src/ 的子目錄,該目錄是一個 Git 工作樹。這鼓勵了已跟蹤檔案(在 src/ 內)與未跟蹤檔案(如構建產物,在 src/ 外)之間的分離。當向 Scalar 註冊一個名稱不是 src 的現有 Git 工作樹時,登記目錄將與該工作樹相同。

scalar 命令實現了各種子命令,並根據子命令提供不同的選項。除了 clonelistreconfigure --all 之外,所有子命令都預期在登記目錄中執行。

以下選項可以在子命令之前指定

-C <目錄>

在執行子命令之前,更改當前工作目錄。此選項模仿了 git[1] 的相同選項。

-c <鍵>=<值>

在執行指定子命令期間配置此設定。此選項模仿了 git[1] 的相同選項。

命令

Clone (克隆)

clone [<選項>] <url> [<登記目錄>]

克隆指定的倉庫,類似於 git-clone[1]。預設情況下,僅克隆提交 (commit) 和樹 (tree) 物件。完成後,工作樹位於 <登記目錄>/src

稀疏檢出 (sparse-checkout) 功能預設啟用(除非帶 --full-clone 執行),且初始僅顯示頂層目錄中的檔案。使用 git sparse-checkout set 來擴充套件你想要檢視的目錄集,或使用 git sparse-checkout disable 擴充套件到所有檔案(詳見 git-sparse-checkout[1])。你可以透過使用 git ls-tree HEAD[:<目錄>] 來瀏覽稀疏檢出之外的子目錄。

-b <名稱>
--branch <名稱>

不檢出被克隆倉庫 HEAD 所指向的分支,而是檢出 <名稱> 分支。

--single-branch
--no-single-branch

僅克隆通往單個分支末端的歷史記錄,該分支由 --branch 選項指定或為遠端倉庫 HEAD 指向的主分支。

後續對生成倉庫的獲取 (fetch) 操作將僅更新用於初始克隆的分支的遠端跟蹤分支。如果在進行 --single-branch 克隆時遠端 HEAD 未指向任何分支,則不會建立遠端跟蹤分支。

--src
--no-src

預設情況下,scalar clone 將克隆的倉庫放置在 <登記目錄>/src 目錄中。使用 --no-src 可將克隆的倉庫直接放置在 <登記目錄> 中。

--tags
--no-tags

預設情況下,scalar clone 會獲取遠端通告的標籤物件,且未來的 git fetch 命令也會執行同樣操作。使用 --no-tags 可以在克隆時避免獲取標籤,並配置倉庫在未來也不獲取標籤。若要在使用 --no-tags 克隆後獲取標籤,請執行 git fetch --tags

--full-clone
--no-full-clone

預設會初始化稀疏檢出。可以透過 --full-clone 關閉此行為。

--maintenance
--no-maintenance

預設情況下,scalar clone 將登記目錄配置為使用 Git 的後臺維護功能。使用 --no-maintenance 可跳過此配置。

List (列出)

list

列出當前由 Scalar 註冊的登記目錄。此子命令不需要在登記目錄內執行。

Register (註冊)

register [<登記目錄>]

將登記目錄的倉庫新增到已註冊倉庫列表中,並啟動後臺維護。如果未提供 <登記目錄>,則註冊與當前工作目錄關聯的登記目錄。

注意:當在名為 src/ 的工作樹中呼叫此子命令時,其父目錄被視為 Scalar 登記目錄。如果工作樹src/,則其自身將被視為 Scalar 登記目錄。

--maintenance
--no-maintenance

預設情況下,scalar register 將登記目錄配置為使用 Git 的後臺維護功能。使用 --no-maintenance 可跳過此配置。這不會停用可能已透過其他方式啟用的任何維護任務。

Unregister (登出)

unregister [<登記目錄>]

將指定的倉庫從 Scalar 註冊的倉庫列表中移除,並停止計劃的後臺維護。

Run (執行)

scalar run ( all | config | commit-graph | fetch | loose-objects | pack-files ) [<登記目錄>]

執行給定的維護任務(如果指定了 all 則執行所有任務)。除 allconfig 外,此子命令只需移交給 git-maintenance[1] 執行(將 fetch 對映為 prefetch,將 pack-files 對映為 incremental-repack)。

一旦倉庫在 Scalar 註冊,這些任務將作為計劃維護的一部分自動執行。因此,通常不需要手動執行此子命令。

config 任務是 Scalar 特有的,它配置所有那些能讓 Git 在大型倉庫中更高效工作的強制性預設設定。由於此任務作為 scalar clone 的一部分自動執行,因此很少需要顯式呼叫此任務。

Reconfigure (重新配置)

在 Scalar 升級後,或者當 Scalar 登記目錄的配置因某種原因損壞或被誤改時,此子命令允許重新配置登記目錄。

--all

指定 --all 時,重新配置當前由 scalar.repo 配置鍵在 Scalar 註冊的所有登記目錄。建議在每次升級後使用此選項以獲取最新功能。

--maintenance=(enable|disable|keep)

預設情況下,Scalar 將登記目錄配置為使用 Git 的後臺維護功能;這與為該選項使用 enable 值相同。使用 disable 值可將所考慮的每個登記目錄從後臺維護中移除。使用 ‘keep’ 保持這些倉庫的後臺維護配置不變。

Diagnose (診斷)

diagnose [<登記目錄>]

在報告 Scalar 的問題時,提供此命令收集的資訊通常很有幫助,包括日誌和描述當前登記目錄資料形態的某些統計資訊。

該命令的輸出是一個 .zip 檔案,寫入到 src 目錄中工作樹相鄰的目錄裡。

Delete (刪除)

delete <登記目錄>

此子命令允許你從本地檔案系統中刪除現有的 Scalar 登記目錄,並登出該倉庫。

作為 scalar clonescalar register 的一部分,某些 Git 配置值會被設定,以針對大型倉庫或跨平臺支援進行最佳化。這些選項會根據大型倉庫的最佳已知建議在新的 Git 版本中更新,使用者可以透過執行 scalar reconfigure [--all] 來獲取最新的建議。

本節列出了最新版本中所設配置值的理由。

am.keepCR=true

此設定對於 Windows 和非 Windows 平臺之間的跨平臺開發非常重要,並可在某些工作流中保留回車 (\r) 字元。

commitGraph.changedPaths=true

此設定有助於計算序列化 commit-graph 的後臺維護步驟同時儲存路徑變更 (changed-path) 布隆過濾器。這可以加速檔案歷史命令,並允許使用者在不執行前臺命令的情況下自動獲益。

commitGraph.generationVersion=1

雖然出於效能原因首選版本 2,但預設使用版本 1 的現有使用者在升級到版本 2 時需要特別小心。隨著升級方案的完善,這在未來可能會發生變化。

core.autoCRLF=false

這取消了當僅存在 LF 換行符時,為工作樹檔案新增 CRLF 換行符的轉換。出於效能原因取消了此操作。使用關心 CRLF 換行符的工具的倉庫,應直接提交帶有這些換行符的必要檔案。

core.logAllRefUpdates=true

這將在所有分支上啟用引用日誌 (reflog)。雖然這對於大型倉庫有效能成本,但它通常是使用者擺脫困境或向專家尋求支援的重要資料來源。

core.safeCRLF=false

類似於 core.autoCRLF=false,這停用了關於 CRLF 轉換是否可逆的檢查。這是一項效能改進,但如果使用者重新啟用了 core.autoCRLF,則可能存在危險。

credential.https://dev.azure.com.useHttpPath=true

此設定僅針對 Azure DevOps 的 Web URL 啟用 credential.useHttpPath 功能。這對於使用多個組織以及多個憑據令牌與該服務互動的使用者非常重要。

feature.experimental=false

這停用了在此功能配置下歸類的“實驗性”最佳化。預期所有有價值的最佳化也已由 Scalar 配置顯式設定,任何差異都是故意的。顯著差異包括停用了針對客戶端 Scalar 倉庫的若干點陣圖 (bitmap) 相關配置選項。

feature.manyFiles=false

這停用了在此功能配置下歸類的“多檔案”最佳化。預期所有有價值的最佳化也已由 Scalar 配置顯式設定,任何差異都是故意的。

fetch.showForcedUpdates=false

這停用了 git fetch 結束時的檢查,該檢查會通知使用者引用更新是否為強制更新(即先前位置無法從最新位置到達)。此檢查在大型倉庫中可能非常昂貴,因此被停用並替換為建議訊息。設定 advice.fetchShowForcedUpdates=false 可停用此建議訊息。

fetch.unpackLimit=1

此設定防止 Git 將從伺服器下載的包檔案 (packfiles) 解包為鬆散物件 (loose objects)。預設限制 100 旨在防止因包檔案過多導致的效能問題,但 Scalar 使用後臺維護來對包檔案進行分組並使用多包索引 (multi-pack-index) 覆蓋它們,從而消除了此問題。

fetch.writeCommitGraph=false

此配置設定旨在幫助使用者在執行獲取操作時自動更新其 commit-graph 檔案。然而,這會佔用前臺獲取和拉取的時間,而 Scalar 使用後臺維護來執行此功能。

gc.auto=0

這停用了自動垃圾回收,因為 Scalar 使用後臺維護來保持倉庫資料的良好狀態。

gui.GCWarning=false

由於 Scalar 透過設定 gc.auto=0 停用了垃圾回收,git-gui 工具可能會開始對此設定發出警告。停用此警告,因為 Scalar 的後臺維護配置已使該警告變得無關緊要。

index.skipHash=true

停用在寫入索引內容時計算其雜湊值。這有助於提高效能,特別是對於大型索引檔案。

index.threads=true

這告訴 Git 根據 core.preloadIndex 的預設值自動檢測在讀取索引時應使用的執行緒數,從而啟用並行索引讀取。此顯式設定還啟用了 index.recordOffsetTable=true 以加速並行索引讀取。

index.version=4

此索引版本為路徑名添加了壓縮,大幅減小了大型倉庫的索引大小。這是一項重要的效能提升。

log.excludeDecoration=refs/prefetch/*

由於 Scalar 啟用了帶有 incremental 策略的後臺維護,此設定可避免後臺預取 (prefetch) 操作儲存的引用汙染 git log 的輸出。

merge.renames=true

在大型倉庫中計算合併時,檢測重新命名對於最大限度地提高獲得正確驗證結果的可能性尤為重要。在本地執行合併的使用者通常是因為伺服器端合併(透過拉取請求或類似方式)導致了衝突。雖然這是預設設定,但顯式設定它是為了覆蓋使用者出於效能原因可能對 diff.renames 進行的潛在更改。

merge.stat=false

這停用了計算合併後的 diff 輸出。這提高了大型倉庫中 git merge 的效能,同時減少了冗餘輸出。

pack.useBitmaps=false

這停用了使用附加到包檔案的 .bitmap 檔案。點陣圖檔案是針對伺服器端而非客戶端使用而最佳化的。Scalar 停用此項是為了避免使用者誤建立 .bitmap 檔案時可能出現的效能問題。

pack.usePathWalk=true

這預設啟用了 git pack-objects--path-walk 選項。這可以加速由 git push 和其他重新打包 (repack) 操作建立的包檔案的計算和壓縮。

receive.autoGC=false

類似於 gc.auto,停用此設定以優先使用後臺維護。

status.aheadBehind=false

這停用了通常在 git status 命令期間發生的領先/落後 (ahead/behind) 計算。這些資訊經常被使用者忽略,但在每天接收成千上萬個提交的大型倉庫中,計算成本可能很高。該計算被替換為一條建議訊息,可以透過停用 advice.statusAheadBehind 配置來關閉該訊息。

以下設定根據所使用的平臺而有所不同

core.untrackedCache=(true|false)

未跟蹤快取功能對於大型倉庫的效能提升很重要,但在 Windows 檔案系統上已顯示出一些錯誤。因此,此項在其他平臺上設定,但在 Windows 上停用。

http.sslBackend=schannel

在 Windows 上,openssl 後端在處理某些型別的遠端提供程式和證書型別時存在問題。覆蓋預設設定以避免這些常見問題。

另請參閱

GIT

Git[1] 套件的一部分