?
This document uses PHP Chinese website manual Release
git-fast-import - 用于快速Git數(shù)據(jù)導(dǎo)入器的后端
frontend | git fast-import [options]
這個程序通常不是最終用戶想要直接運(yùn)行的。大多數(shù)最終用戶都希望使用現(xiàn)有的前端程序之一,該前端程序解析特定類型的外部源,并將存儲在其中的內(nèi)容提供給它們git fast-import
。
快速導(dǎo)入從標(biāo)準(zhǔn)輸入讀取混合命令/數(shù)據(jù)流,并將一個或多個包文件直接寫入當(dāng)前存儲庫。當(dāng)在標(biāo)準(zhǔn)輸入接收到EOF時,快速導(dǎo)入會寫出更新的分支和標(biāo)記參考,并使用新導(dǎo)入的數(shù)據(jù)完全更新當(dāng)前存儲庫。
快速導(dǎo)入后端本身可以導(dǎo)入到一個空的存儲庫(已經(jīng)初始化git init
的存儲庫)或增量更新現(xiàn)有的已填充存儲庫。是否從特定的外部源支持增量導(dǎo)入取決于正在使用的前端程序。
--force
強(qiáng)制更新已修改的現(xiàn)有分支,即使這樣做會導(dǎo)致提交丟失(因為新提交不包含舊提交)。
--quiet
禁用所有非致命輸出,在成功時快速導(dǎo)入無聲。該選項禁用--stats顯示的輸出。
--stats
顯示有關(guān)fast-import創(chuàng)建的對象的基本統(tǒng)計信息,它們存儲到的包文件以及在此運(yùn)行期間通過快速導(dǎo)入使用的內(nèi)存。顯示此輸出目前是默認(rèn)值,但可以使用--quiet禁用。
--cat-blob-fd=<fd>
寫響應(yīng)get-mark
,cat-blob
以及ls
查詢到文件描述符<FD>代替stdout
。允許progress
將最終用戶的輸出與其他輸出分離。
--date-format=<fmt>
指定日期的前端將供應(yīng)給中快速導(dǎo)入的類型author
,committer
和tagger
命令。有關(guān)支持哪些格式及其語法的詳細(xì)信息,請參閱下面的“日期格式”。
--done
如果done
流尾沒有命令,則會終止并報錯。此選項對于檢測導(dǎo)致前端在開始寫入流之前終止的錯誤可能很有用。
--export-marks=<file>
完成后將內(nèi)部標(biāo)記表轉(zhuǎn)儲到<file>。標(biāo)記每行寫成一個:markid SHA-1
。前端可以使用此文件在導(dǎo)入完成后驗證導(dǎo)入,或跨增量運(yùn)行保存標(biāo)記表。由于<file>僅在檢查點(diǎn)(或完成)時打開并截斷,因此同樣的路徑也可以安全地分配給--import-marks。
--import-marks=<file>
在處理任何輸入之前,請加載<文件>中指定的標(biāo)記。輸入文件必須存在,必須可讀,并且必須使用與--export-marks相同的格式??梢蕴峁┒鄠€選項來導(dǎo)入一組以上的標(biāo)記。如果標(biāo)記被定義為不同的值,則最后一個文件將獲勝。
--import-marks-if-exists=<file>
就像--import-marks一樣,但不是錯誤的,如果文件不存在,靜靜地跳過文件。
--no-relative-marks
指定--relative-marks之后,使用--import-marks =和--export-marks =指定的路徑與當(dāng)前存儲庫中的內(nèi)部目錄相關(guān)。在git-fast-import中,這意味著路徑相對于.git / info / fast-import目錄。但是,其他進(jìn)口商可能會使用不同的地點(diǎn)。
相對標(biāo)記和非相關(guān)標(biāo)記可以通過交織 - (無 - ) - 相對標(biāo)記與 - (import | export)-marks =選項進(jìn)行組合。
--active-branches=<n>
一次保持活動的最大分支數(shù)量。有關(guān)詳細(xì)信息,請參閱下面的“內(nèi)存使用率” 缺省值是5。
--big-file-threshold=<n>
快速導(dǎo)入將嘗試創(chuàng)建增量的最大大小,以字節(jié)表示。默認(rèn)值為512m(512 MiB)。一些進(jìn)口商可能希望在內(nèi)存受限的系統(tǒng)上降低這一點(diǎn)。
--depth=<n>
最大增量深度,用于blob和樹的分離。默認(rèn)值是50。
--export-pack-edges=<file>
創(chuàng)建一個 packfile 后,將一行數(shù)據(jù)打印到<file>列出 packfile 的文件名以及每個分支寫入 packfile 的最后一次提交。導(dǎo)入其總對象集超過 4 GiB packfile 限制的項目后,此信息可能會有用,因為這些提交可用作呼叫期間的邊緣點(diǎn)git pack-objects
。
--max-pack-size=<n>
每個輸出包文件的最大大小。默認(rèn)值是無限的。
fastimport.unpackLimit
見git-config [1]
快速導(dǎo)入的設(shè)計允許它以最少的內(nèi)存使用量和處理時間導(dǎo)入大型項目。假設(shè)前端能夠跟上快速導(dǎo)入并為其提供持續(xù)不斷的數(shù)據(jù)流,對于持續(xù)10年以上歷史并且包含100,000個以上單獨(dú)提交的項目,導(dǎo)入時間通常僅需1-2小時即可完成(相當(dāng)適中) ?$ 2,000美元)硬件。
大多數(shù)瓶頸似乎在外部源數(shù)據(jù)訪問(源代碼無法足夠快地提取修訂版本)或磁盤IO(快速導(dǎo)入寫入與磁盤接收數(shù)據(jù)一樣快)。如果源數(shù)據(jù)存儲在與目標(biāo)Git存儲庫不同的驅(qū)動器上(由于較少的IO爭用),導(dǎo)入將運(yùn)行得更快。
一個典型的快速導(dǎo)入前端往往會用大約200行的Perl / Python / Ruby代碼進(jìn)行權(quán)衡。大多數(shù)開發(fā)者在幾個小時內(nèi)就能創(chuàng)建工作導(dǎo)入者,盡管這是他們第一次接觸快速導(dǎo)入,有時甚至是Git。這是一個理想的情況,因為大多數(shù)轉(zhuǎn)換工具都是丟棄(使用一次,永遠(yuǎn)不會回頭)。
像git push
或者git fetch
,通過快速導(dǎo)入處理的導(dǎo)入可以安全地與并行git repack -a -d
或git gc
調(diào)用或任何其他Git操作(包括git prune
快速導(dǎo)入從不使用的松散對象)一起運(yùn)行。
快速導(dǎo)入不鎖定它正在主動導(dǎo)入的分支或標(biāo)簽。導(dǎo)入之后,在其ref引用更新階段,快速導(dǎo)入測試每個現(xiàn)有的分支引用,以驗證更新是否為快速更新(存儲在ref中的提交包含在要寫入的提交的新歷史記錄中)。如果更新不是快進(jìn)更新,則快速導(dǎo)入將跳過更新該參考文件,而是輸出警告消息。快速導(dǎo)入將始終嘗試更新所有分支引用,并且不會在第一次失敗時停止。
可以使用--force強(qiáng)制更新分支,但建議僅在安靜的存儲庫上使用分支更新。初始導(dǎo)入到一個空的存儲庫時,使用--force不是必需的。
快速導(dǎo)入跟蹤記憶中的一組分支。通過commit
在輸入流上發(fā)送命令,可以在導(dǎo)入過程中的任何時刻創(chuàng)建或修改任何分支。這種設(shè)計允許前端程序同時處理無限數(shù)量的分支,按照源數(shù)據(jù)可用的順序生成提交。它也大大簡化了前端程序。
快速導(dǎo)入不會使用或更改當(dāng)前的工作目錄或其中的任何文件。(但它會更新當(dāng)前的Git存儲庫,如引用的那樣)GIT_DIR
。因此,導(dǎo)入前端可以將工作目錄用于自己的目的,例如從外部源提取文件修訂版。工作目錄的這種無知還允許快速導(dǎo)入運(yùn)行非常快,因為在分支之間切換時不需要執(zhí)行任何代價高昂的文件更新操作。
除了原始文件數(shù)據(jù)(Git沒有解釋)之外,快速導(dǎo)入輸入格式是基于文本(ASCII)的格式。這種基于文本的格式簡化了前端程序的開發(fā)和調(diào)試,特別是在使用諸如Perl,Python或Ruby的高級語言時。
快速進(jìn)口對其投入非常嚴(yán)格。當(dāng)我們說下面SP意味著我們正好有一個空格。同樣,LF表示一個(且只有一個)換行符和HT一個(并且只有一個)水平制表符。提供額外的空白字符會導(dǎo)致意想不到的結(jié)果,例如分支名稱或文件名稱中包含前導(dǎo)或尾隨空格,或者在遇到意外輸入時提前終止快速導(dǎo)入。
為了幫助快速調(diào)試前端,import-ignore會忽略以#
(ASCII pound / hash)開頭并包含行結(jié)尾的行LF
。注釋行可能包含任何不包含LF的字節(jié)序列,因此可用于包含任何可能特定于前端的詳細(xì)調(diào)試信息,并且在檢查快速導(dǎo)入數(shù)據(jù)流時很有用。
支持以下日期格式。前端應(yīng)通過將格式名稱傳遞給--date-format = <fmt>命令行選項來選擇將用于此導(dǎo)入的格式。
raw
這是Git本地格式,并且是<time> SP <offutc>
。如果未指定--date-format,它也是快速導(dǎo)入的默認(rèn)格式。
事件的時間由<time>
自UNIX紀(jì)元(1970年1月1日午夜,UTC)以來的秒數(shù)指定,并寫為ASCII十進(jìn)制整數(shù)。
本地偏移<offutc>
量由UTC 指定為正值或負(fù)值。例如,EST(UTC時間后5小時)將以<tz>
“-0500” 表示,而UTC為“+0000”。本地抵消不影響<time>
; 它僅用作幫助格式化例程顯示時間戳的建議。
如果源材料中的本地偏移量不可用,請使用“+0000”或最常用的本地偏移量。例如,很多組織都有一個CVS存儲庫,它只能被位于相同位置和時區(qū)的用戶訪問。在這種情況下,可以假定與UTC的合理偏移。
與rfc2822
格式不同,這種格式非常嚴(yán)格。格式的任何變化都會導(dǎo)致快速導(dǎo)入拒絕該值。
rfc2822
這是RFC 2822所描述的標(biāo)準(zhǔn)電子郵件格式。
示例值為“2月6日11:22:18 2007年-0500”。Git解析器是準(zhǔn)確的,但在寬松的一面。這是git am
應(yīng)用從電子郵件收到的補(bǔ)丁時使用的解析器。
一些格式錯誤的字符串可能被接受為有效日期。在某些情況下,Git仍然可以從格式不正確的字符串中獲取正確的日期。也有一些類型的錯誤的字符串,Git會解析錯誤,但仍然認(rèn)為是有效的。嚴(yán)重格式錯誤的字符串將被拒絕。
與上述raw
格式不同,包含在RFC 2822日期字符串中的時區(qū)/ UTC偏移量信息用于在存儲之前將日期值調(diào)整為UTC。因此,重要的是這些信息盡可能準(zhǔn)確。
如果源材料使用RFC 2822風(fēng)格的日期,則前端應(yīng)該讓快速導(dǎo)入處理分析和轉(zhuǎn)換(而不是嘗試自行完成),因為Git分析器已經(jīng)得到了廣泛的測試。
raw
如果源代碼材料已經(jīng)使用UNIX-epoch格式,可以通過指定格式給出日期,或者可以很容易地將格式轉(zhuǎn)換為格式,前端應(yīng)該更喜歡這種格式,因為在解析時沒有歧義。
now
始終使用當(dāng)前時間和時區(qū)。文字now
必須始終提供<when>
。
這是一種玩具格式。該系統(tǒng)的當(dāng)前時間和時區(qū)在通過快速導(dǎo)入創(chuàng)建時總是被復(fù)制到標(biāo)識字符串中。沒有辦法指定不同的時間或時區(qū)。
提供這種特定的格式是因為它實現(xiàn)起來很短,對于想要立即創(chuàng)建新提交的進(jìn)程可能很有用,而無需使用工作目錄或git update-index
。
如果單獨(dú)的author
和committer
命令以使用commit
時間戳可能不匹配,因為系統(tǒng)時鐘將被輪詢兩次(一次對每個命令)。確保作者和提交者身份信息具有相同時間戳的唯一方法是省略author
(從而復(fù)制committer
)或使用除now
。以外的日期格式。
fast-import接受幾個命令來更新當(dāng)前的存儲庫并控制當(dāng)前的導(dǎo)入過程。稍后會對每條命令進(jìn)行更詳細(xì)的討論(附帶示例)。
commit
通過創(chuàng)建新的提交并更新分支以指向新創(chuàng)建的提交,創(chuàng)建新分支或更新現(xiàn)有分支。
tag
從現(xiàn)有的提交或分支中創(chuàng)建一個帶注釋的標(biāo)簽對象。輕量級標(biāo)記不受此命令支持,因為它們不建議用于及時記錄有意義的點(diǎn)。
reset
將現(xiàn)有分支(或新分支)重置為特定修訂。必須使用此命令將分支更改為特定的修訂版,而無需對其進(jìn)行提交。
blob
將原始文件數(shù)據(jù)轉(zhuǎn)換為blob,以供將來在commit
命令中使用。該命令是可選的,不需要執(zhí)行導(dǎo)入。
checkpoint
強(qiáng)制快速導(dǎo)入以關(guān)閉當(dāng)前的包文件,生成其獨(dú)特的SHA-1校驗和和索引,并啟動新的包文件。該命令是可選的,不需要執(zhí)行導(dǎo)入。
progress
導(dǎo)致快速導(dǎo)入將整個線路回顯到其自己的標(biāo)準(zhǔn)輸出。該命令是可選的,不需要執(zhí)行導(dǎo)入。
done
標(biāo)記流的結(jié)束。除非done
使用--done
命令行選項或feature done
命令請求功能,否則此命令是可選的。
get-mark
導(dǎo)致fast-import將標(biāo)記對應(yīng)的SHA-1打印到設(shè)置的文件描述符中--cat-blob-fd
,或者stdout
未指定。
cat-blob
導(dǎo)致fast-import將cat-file --batch
格式打印到使用--cat-blob-fd
或未指定的文件描述符stdout
中。
ls
導(dǎo)致 fast-import 將描述目錄條目的行以ls-tree
格式打印到使用--cat-blob-fd
或未指定的文件描述符stdout
中。
feature
啟用指定的功能。這要求快速導(dǎo)入支持指定的功能,如果不支持則中止。
option
指定OPTIONS下列出的任何不改變流語義以滿足前端需求的選項。該命令是可選的,不需要執(zhí)行導(dǎo)入。
commit
用新提交創(chuàng)建或更新分支,記錄項目的邏輯更改。
'commit' SP <ref> LF mark? ('author' (SP <name>)? SP LT <email> GT SP <when> LF)? 'committer' (SP <name>)? SP LT <email> GT SP <when> LF data ('from' SP <commit-ish> LF)? ('merge' SP <commit-ish> LF)? (filemodify | filedelete | filecopy | filerename | filedeleteall | notemodify)* LF?
其中<ref>
是進(jìn)行提交的分支的名稱。通常分支名稱以refs/heads/
Git 作為前綴,因此導(dǎo)入CVS分支符號RELENG-1_0
將用作refs/heads/RELENG-1_0
值<ref>
。<ref>
在Git中的值必須是有效的refname。由于LF
在Git refname中無效,因此此處不支持引用或轉(zhuǎn)義語法。
mark
可以選擇出現(xiàn)一個命令,請求快速導(dǎo)入以保存對新創(chuàng)建的提交的引用,以供將來前端使用(請參閱下面的格式)。前端非常常見的是標(biāo)記他們創(chuàng)建的每個提交,從而允許從任何導(dǎo)入的提交創(chuàng)建未來的分支。
以下data
命令committer
必須提供提交消息(請參閱下面的data
命令語法)。要導(dǎo)入一個空的提交消息,請使用長度為0的數(shù)據(jù)。提交消息是自由格式的,不被 Git 解釋。目前它們必須以 UTF-8 編碼,因為快速導(dǎo)入不允許指定其他編碼。
零個或多個filemodify
,filedelete
,filecopy
,filerename
,filedeleteall
和notemodify
命令可以被包括到分支的內(nèi)容創(chuàng)建的提交之前更新。這些命令可以以任何順序提供。然而,建議一個filedeleteall
命令優(yōu)先于所有filemodify
,filecopy
,filerename
和notemodify
在相同的命令提交,作為filedeleteall
擦拭干凈分支(見下文)。
LF
命令之后是可選的(它曾經(jīng)是必需的)。
author
如果作者信息可能與提交者信息不同,則可以選擇出現(xiàn)一條author
命令。如果author
省略,那么快速導(dǎo)入將自動使用提交者的信息作為提交的作者部分。請參閱下文中的字段說明author
,因為它們與之相同committer
。
committer
committer
命令表明是誰做出這個提交,以及何時提交。
<name>
是人的顯示名稱(例如“ Com M itter ”),并且<email>
是人的電子郵件地址(“cm@example.com”)。LT
并且GT
是文字小于(\ x3c)和大于(\ x3e)的符號。這些都需要從行中的其他字段分隔電子郵件地址。注意,<name>
和<email>
是自由形式,并且可以包含任何字節(jié)序列,不同之處LT
,GT
和LF
。<name>
通常是 UTF-8 編碼。
更改時間通過<when>
使用由--date-format = <fmt> 命令行選項選擇的日期格式指定。有關(guān)支持的一組格式及其語法,請參閱上面的“日期格式”。
from
from
命令用于指定從該初始化分支的提交。這次修訂將是新提交的第一個父類。在此提交中構(gòu)建的樹的狀態(tài)將以from
提交時的狀態(tài)開始,并由此提交中的內(nèi)容修改進(jìn)行更改。
from
在新分支的第一次提交中省略命令將導(dǎo)致快速導(dǎo)入來創(chuàng)建沒有父類的提交。這往往只適用于項目的初始提交。如果前端在創(chuàng)建新分支時從頭開始創(chuàng)建所有文件,merge
則可以使用命令而不from
是以空樹開始提交。from
通常需要省略現(xiàn)有分支上的命令,因為分支上的當(dāng)前提交被自動假定為新提交的第一個父類。
由于LF
在 Git refname 或 SHA-1 表達(dá)式中無效,因此在內(nèi)部不支持引用或轉(zhuǎn)義語法<commit-ish>
。
<commit-ish>
是以下任何一項:
已經(jīng)在快速導(dǎo)入的內(nèi)部分支表中的現(xiàn)有分支的名稱。如果快速導(dǎo)入不知道名稱,則將其視為 SHA-1 表達(dá)式。
標(biāo)記參考,標(biāo)記號:<idnum>
在哪里<idnum>
。快速導(dǎo)入:
用來表示標(biāo)記引用的原因是該字符在Git分支名稱中不合法。領(lǐng)先的:
使得它很容易區(qū)分標(biāo)志42(:42
)和分支42(42
或refs/heads/42
),或者是一個簡單的 SHA-1,它恰好只包含了基數(shù)為10的數(shù)字。標(biāo)記必須先聲明(通過mark
)才可以使用。
完整的40字節(jié)或縮寫的提交 SHA-1(十六進(jìn)制)。
任何有效的解析為提交的 Git SHA-1 表達(dá)式。有關(guān)詳細(xì)信息,請參閱 gitrevisions [7] 中的“指定修訂”。
特殊的空 SHA-1(40個零)指定分支要被移除。
從當(dāng)前分支值重新啟動增量導(dǎo)入的特殊情況應(yīng)寫為:
from refs/heads/branch^0
^0
后綴是必需的,因為快速導(dǎo)入不允許一個分支,從自身做起,并在內(nèi)存中創(chuàng)建from
分支之前,即使從輸入讀取命令。添加^0
將強(qiáng)制快速導(dǎo)入通過 Git 的修訂解析庫而不是其內(nèi)部分支表來解析提交,從而加載分支的現(xiàn)有值。
merge
包含一個額外的父類提交。額外的父類鏈接不會改變在此提交時樹狀態(tài)的構(gòu)建方式。如果from
在創(chuàng)建新分支時省略該命令,則第一次merge
提交將是當(dāng)前提交的第一個祖先,并且分支將從沒有文件開始。merge
快速導(dǎo)入允許每次提交的命令數(shù)量不受限制,從而建立 n 路合并。
這里<commit-ish>
是任何承諾規(guī)范表達(dá)式也被from
接受(見上文)。
filemodify
包含在commit
添加新文件或更改現(xiàn)有文件內(nèi)容的命令中。該命令有兩種不同的方式來指定文件的內(nèi)容。
外部數(shù)據(jù)格式
文件的數(shù)據(jù)內(nèi)容已由先前的blob
命令提供。前端只需要連接它。
'M' SP <mode> SP <dataref> SP <path> LF
這里通常<dataref>
必須是:<idnum>
由先前blob
命令設(shè)置的標(biāo)記引用()或現(xiàn)有 Git Blob 對象的完整40字節(jié) SHA-1 。如果<mode>
是,040000`
則<dataref>
必須是現(xiàn)有 Git 樹對象的全部40字節(jié) SHA-1 或使用其設(shè)置的標(biāo)記引用--import-marks
。
內(nèi)聯(lián)數(shù)據(jù)格式
文件的數(shù)據(jù)內(nèi)容尚未提供。前端想要提供它作為這個修改命令的一部分。
'M' SP <mode> SP 'inline' SP <path> LF data
請參閱下面的data
命令的詳細(xì)說明。
這兩種格式<mode>
都是八進(jìn)制文件輸入的類型。Git 僅支持以下模式:
100644
或者644
:正常(不可執(zhí)行)文件。大多數(shù)項目中的大多數(shù)文件都使用此模式。如果有疑問,這是你想要的。
100755
或者755
:正常但可執(zhí)行的文件。
120000
:一個符號鏈接,文件的內(nèi)容將成為鏈接目標(biāo)。
160000
:對象的 gitlink,SHA-1 引用另一個存儲庫中的提交。Git 鏈接只能由 SHA 或通過提交標(biāo)記指定。它們用于實現(xiàn)子模塊。
040000
:一個子目錄。子目錄只能通過 SHA 或通過設(shè)置樹標(biāo)記來指定--import-marks
。
兩種格式<path>
都是要添加的文件的完整路徑(如果尚不存在)或修改(如果已經(jīng)存在)。
<path>
字符串必須使用 UNIX 風(fēng)格的目錄分隔符(正斜杠/
),可能包含除了以外的任何字節(jié)LF
,并且不得以雙引號("
)開頭。
一個路徑可以使用 C 風(fēng)格的字符串引用; 這在所有情況下都被接受,并且如果文件名以雙引號或包含開頭則是強(qiáng)制性的LF
。在 C 風(fēng)格的引用中,完整名稱應(yīng)該用雙引號括起來,并且任何LF
反斜杠或雙引號字符都必須用反斜杠(例如,"path/with\n, \\ and \" in it"
)在前面進(jìn)行轉(zhuǎn)義。
價值<path>
必須是規(guī)范形式。這不是:
包含一個空目錄組件(例如foo//bar
無效),
以目錄分隔符結(jié)束(例如foo/
無效),
以目錄分隔符開始(例如/foo
無效),
包含特殊組件.
或..
(例如foo/./bar
和foo/../bar
無效)。
樹的根可以用空字符串表示<path>
。
建議<path>
始終使用 UTF-8 編碼。
filedelete
包含在commit
刪除文件的命令中或遞歸地從分支中刪除整個目錄。如果文件或目錄刪除使其父目錄為空,則父目錄也會自動刪除。這會級聯(lián)樹直到達(dá)到第一個非空目錄或根目錄。
'D' SP <path> LF
這里<path>
是從分支中刪除的文件或子目錄的完整路徑。請參閱filemodify
上面的詳細(xì)說明<path>
。
filecopy
遞歸地將現(xiàn)有文件或子目錄復(fù)制到分支內(nèi)的其他位置?,F(xiàn)有的文件或目錄必須存在。如果目標(biāo)存在,它將被從源復(fù)制的內(nèi)容完全替換。
'C' SP <path> SP <path> LF
這里第一個<path>
是源位置,第二個<path>
是目的地。有關(guān)可能的外觀filemodify
的詳細(xì)說明,請參閱上文<path>
。要使用包含 SP 的源路徑,必須引用該路徑。
一條filecopy
命令立即生效。一旦將源位置復(fù)制到目標(biāo)位置,將來應(yīng)用于源位置的任何命令都不會影響副本的目標(biāo)位置。
filerename
將現(xiàn)有文件或子目錄重命名為分支中的其他位置?,F(xiàn)有的文件或目錄必須存在。如果目標(biāo)存在,它將被源目錄取代。
'R' SP <path> SP <path> LF
這里第一個<path>
是源位置,第二個<path>
是目的地。有關(guān)可能的外觀filemodify
的詳細(xì)說明,請參閱上文<path>
。要使用包含 SP 的源路徑,必須引用該路徑。
filerename
命令立即生效。一旦源位置已被重命名為目標(biāo),任何應(yīng)用于源位置的命令都將在那里創(chuàng)建新文件,而不會影響重命名的目標(biāo)。
請注意,filerename
與源位置filecopy
后跟的filedelete
是一樣的。使用filerename
時有一個輕微的性能優(yōu)勢,但優(yōu)點(diǎn)非常小,因此永遠(yuǎn)不值得嘗試將源資料中的刪除/添加對轉(zhuǎn)換為重命名以快速導(dǎo)入。提供filerename
命令只是為了簡化已經(jīng)具有重命名信息的前端,并且不希望將filecopy
分解為后面的filedelete
。
filedeleteall
包含在commit
從分支中刪除所有文件(以及所有目錄)的命令中。該命令重置內(nèi)部分支結(jié)構(gòu)以使其中沒有文件,從而允許前端從頭開始添加所有有趣的文件。
'deleteall' LF
如果前端不知道(或不在乎知道)分支上當(dāng)前有哪些文件,則該命令非常有用,因此無法生成filedelete
更新內(nèi)容的正確命令。
發(fā)出一個filedeleteall
后面緊跟著所需的filemodify
命令來設(shè)置正確的內(nèi)容將產(chǎn)生與只發(fā)送所需命令filemodify
和filedelete
命令相同的結(jié)果。filedeleteall
但是,這種方法可能需要快速導(dǎo)入,以便在每個活動分支中使用更多的內(nèi)存(即使是大多數(shù)大型項目也少于1 MiB); 因此鼓勵那些只能輕松獲得提交的受影響路徑的前端這樣做。
notemodify
包含在commit
<notes_ref>
添加注釋a <commit-ish>
或更改此注釋內(nèi)容的新注釋的命令中。它在內(nèi)部與<commit-ish>
路徑上的 filemodify 100644 類似(可能拆分成子目錄)。建議不要使用任何其他命令來寫入<notes_ref>
樹,除非filedeleteall
刪除此樹中的所有現(xiàn)有筆記。該命令有兩種不同的方式來指定音符的內(nèi)容。
外部數(shù)據(jù)格式
筆記的數(shù)據(jù)內(nèi)容已由先前的blob
命令提供。前端只需要將其連接到將被注釋的提交。
'N' SP <dataref> SP <commit-ish> LF
這<dataref>
可以是:<idnum>
由先前blob
命令設(shè)置的標(biāo)記引用(),也可以是現(xiàn)有 Git Blob 對象的完整40字節(jié) SHA-1。
內(nèi)聯(lián)數(shù)據(jù)格式
筆記的數(shù)據(jù)內(nèi)容尚未提供。前端想要提供它作為這個修改命令的一部分。
'N' SP 'inline' SP <commit-ish> LF data
請參閱下面的data
命令的詳細(xì)說明。
在這兩種格式<commit-ish>
中,任何提交規(guī)范表達(dá)式也被接受from
(參見上文)。
mark
安排快速導(dǎo)入以保存對當(dāng)前對象的引用,允許前端在未來的時間點(diǎn)調(diào)用此對象,而無需知道其 SHA-1 。這里的當(dāng)前對象是mark
命令出現(xiàn)的對象創(chuàng)建命令。這可能是commit
,tag
和blob
,但是commit
是最常見的用法。
'mark' SP ':' <idnum> LF
<idnum>
前端分配給此標(biāo)記的號碼在哪里。該值<idnum>
用
ASCII 十進(jìn)制整數(shù)表示。值 0 保留,不能用作標(biāo)記。只有大于或等于 1 的值才可以用作標(biāo)記。
新標(biāo)記會自動創(chuàng)建。只需<idnum>
在另一個mark
命令中重復(fù)使用相同的標(biāo)記,就可以將現(xiàn)有的標(biāo)記移動到另一個對象。
tag
創(chuàng)建一個引用特定提交的注釋標(biāo)簽。要創(chuàng)建輕量級(未注釋)標(biāo)簽,請參閱reset
下面的命令。
'tag' SP <name> LF 'from' SP <commit-ish> LF 'tagger' (SP <name>)? SP LT <email> GT SP <when> LF data
其中<name>
是要創(chuàng)建的標(biāo)記的名稱。
標(biāo)記名稱會自動用前綴refs/tags/
時,存儲在 Git 的,所以在導(dǎo)入 CVS 分支符號RELENG-1_0-FINAL
將只使用RELENG-1_0-FINAL
了<name>
,并快速導(dǎo)入會寫相應(yīng)的裁判作為refs/tags/RELENG-1_0-FINAL
。
值<name>
必須是 Git 中的有效 refname,因此可能包含正斜杠。由于LF
在 Git refname 中無效,因此此處不支持引用或轉(zhuǎn)義語法。
from
命令與commit
命令中的命令相同; 詳情見上文。
tagger
命令使用與之committer
內(nèi)相同的格式commit
; 再次參見上面的細(xì)節(jié)。
以下data
命令tagger
必須提供帶注釋的標(biāo)記消息(請參閱下面的data
命令語法)。要導(dǎo)入空標(biāo)簽消息,請使用長度為0的數(shù)據(jù)。標(biāo)記消息是自由格式的,不被 Git 解釋。目前它們必須以
UTF-8 編碼,因為快速導(dǎo)入不允許指定其他編碼。
不支持在快速導(dǎo)入過程中從導(dǎo)入過程中簽署帶注釋的標(biāo)簽。不建議嘗試包含您自己的 PGP / GPG 簽名,因為前端不能輕松訪問通常進(jìn)入此簽名的完整字節(jié)集。如果需要簽名,請使用快速導(dǎo)入功能創(chuàng)建輕量級標(biāo)記reset
,然后使用標(biāo)準(zhǔn)git tag
過程在離線情況下創(chuàng)建這些標(biāo)記的注釋版本。
reset
創(chuàng)建(或重新創(chuàng)建)指定的分支,可以從特定修訂開始。reset 命令允許前端from
為現(xiàn)有分支發(fā)出新命令,或者從現(xiàn)有提交創(chuàng)建新分支而不創(chuàng)建新提交。
'reset' SP <ref> LF ('from' SP <commit-ish> LF)? LF?
為的詳細(xì)說明<ref>
和<commit-ish>
參見上述下commit
和from
。
LF
命令之后是可選的(它曾經(jīng)是必需的)。
reset
命令也可用于創(chuàng)建輕量級(未注釋)標(biāo)簽。例如:
reset refs/tags/938from :938
將創(chuàng)建refs/tags/938
引用任何提交標(biāo)記:938
引用的輕量級標(biāo)記。
blob
請求將一個文件修訂版寫入 packfile 。該修訂與任何提交都沒有關(guān)聯(lián); 這個連接必須在隨后的commit
命令中通過指定的標(biāo)記引用
blob 來形成。
'blob' LF mark? data
標(biāo)記命令在這里是可選的,因為一些前端已經(jīng)選擇為 blob 自己生成 Git SHA-1 ,并直接提供給它commit
。然而,這通常比它的價值更大,因為商標(biāo)價格低廉,易于使用。
data
提供原始數(shù)據(jù)(用作 blob /文件內(nèi)容,提交消息或注釋標(biāo)記消息)以快速導(dǎo)入??梢允褂么_切的字節(jié)數(shù)提供數(shù)據(jù),也可以使用終止線來分隔數(shù)據(jù)。用于生產(chǎn)質(zhì)量轉(zhuǎn)換的真正前端應(yīng)始終使用確切的字節(jié)計數(shù)格式,因為它更健壯,性能更好。分隔格式主要用于測試快速導(dǎo)入。
<raw>
部分data
命令中出現(xiàn)的注釋行總是被視為數(shù)據(jù)主體的一部分,因此不會被快速導(dǎo)入忽略。這可以安全地導(dǎo)入任何可能以其開頭的文件/消息內(nèi)容#
。
確切的字節(jié)計數(shù)格式
前端必須指定數(shù)據(jù)的字節(jié)數(shù)。
'data' SP <count> LF <raw> LF?
<count>
確切的字節(jié)數(shù)出現(xiàn)在哪里<raw>
。值<count>
用 ASCII 十進(jìn)制整數(shù)表示。所述LF
的任一側(cè)<raw>
不包含在<count>
,并且將不被包括在導(dǎo)入的數(shù)據(jù)。
在LF
之后<raw>
是可選的(它使用的需要),但建議??偸前沟谜{(diào)試快速導(dǎo)入流變得更容易,因為下一個命令總是從下一行的第0列開始,即使<raw>
沒有結(jié)束LF
。
Delimited format
分隔符字符串用于標(biāo)記數(shù)據(jù)的結(jié)尾??焖賹?dǎo)入將通過搜索分隔符來計算長度。這種格式主要用于測試,不建議用于真實數(shù)據(jù)。
'data' SP '<<' <delim> LF <raw> LF <delim> LF LF?
<delim>
選擇的分隔符字符串在哪里。字符串<delim>
不能出現(xiàn)在一行內(nèi)<raw>
,否則快速導(dǎo)入會認(rèn)為數(shù)據(jù)比實際更早結(jié)束。LF
立即尾隨<raw>
的一部分<raw>
。這是分隔格式的限制之一,不可能提供沒有LF作為其最后一個字節(jié)的數(shù)據(jù)塊。
在LF
后<delim> LF
是可選的(它用于需要)。
checkpoint
強(qiáng)制快速導(dǎo)入以關(guān)閉當(dāng)前 packfile,啟動一個新文件,并保存所有當(dāng)前分支引用,標(biāo)記和標(biāo)記。
'checkpoint' LF LF?
請注意,當(dāng)前包文件達(dá)到--max-pack-size 或4 GiB 時,快速導(dǎo)入會自動切換包文件,無論哪個限制較小。在自動打包文件切換期間,快速導(dǎo)入不會更新分支引用,標(biāo)記或標(biāo)記。
由于checkpoint
需要大量的CPU時間和磁盤 IO(為了計算總體包 SHA-1 校驗和,生成相應(yīng)的索引文件并更新參考文件),單個checkpoint
命令可以輕松完成幾分鐘。
前端可能會選擇在非常大且長時間運(yùn)行的導(dǎo)入期間發(fā)出檢查點(diǎn),或者當(dāng)他們需要允許其他 Git 進(jìn)程訪問分支時。但是,考慮到一個30 GiB Subversion 版本庫可以在大約3小時內(nèi)通過快速導(dǎo)入加載到Git中,顯式檢查點(diǎn)可能不是必需的。
LF
命令之后是可選的(它曾經(jīng)是必需的)。
progress
當(dāng)從輸入流處理命令progress
時,導(dǎo)致 fast-import 將未修改的整行打印到其標(biāo)準(zhǔn)輸出通道(文件描述符1)。命令對當(dāng)前導(dǎo)入或任何快速導(dǎo)入的內(nèi)部狀態(tài)都沒有影響。
'progress' SP <any> LF LF?
<any>
命令的一部分可能包含任何不包含的字節(jié)序列LF
。該LF
命令后是可選的。呼叫者可能希望通過 sed 等工具處理輸出,以刪除線路的前端部分,例如:
frontend | git fast-import | sed 's/^progress //'
在checkpoint
之后立即發(fā)出命令progress
通知閱將讀器何時完成checkpoint
,并且它可以安全地訪問快速更新的參考文獻(xiàn)。
get-mark
導(dǎo)致 fast-import 將與標(biāo)記對應(yīng)的 SHA-1 打印到標(biāo)準(zhǔn)輸出或先前以--cat-blob-fd
參數(shù)排列的文件描述符。該命令對當(dāng)前的導(dǎo)入沒有影響; 其目的是檢索稍后提交的 SHA-1 可能希望在其提交消息中引用的 SHA-1 。
'get-mark' SP ':' <idnum> LF
命令可以在接受評論的流中的任何地方使用。特別是,get-mark
命令可以在提交過程中使用,但不能在data
命令中使用。
有關(guān)如何安全讀取此輸出的詳細(xì)信息,請參閱下面的“對命令的響應(yīng)”。
cat-blob
導(dǎo)致 fast-import 將一個 blob 打印到先前按照--cat-blob-fd
參數(shù)排列的文件描述符中。該命令對當(dāng)前的導(dǎo)入沒有影響; 其主要目的是檢索可能位于快速導(dǎo)入內(nèi)存中但不能從目標(biāo)存儲庫訪問的 Blob 。
'cat-blob' SP <dataref> LF
<dataref>
可以是:<idnum>
之前設(shè)置的標(biāo)記引用(),也可以是已存在或可以寫入的 Git blob 的完整40字節(jié) SHA-1。
輸出使用與以下相同的格式git cat-file --batch
:
<sha1> SP 'blob' SP <size> LF<contents> LF
命令可以在接受評論的流中的任何地方使用。特別是,cat-blob
命令可以在提交過程中使用,但不能在data
命令中使用。
有關(guān)如何安全讀取此輸出的詳細(xì)信息,請參閱下面的“對命令的響應(yīng)”。
ls
在先前按--cat-blob-fd
參數(shù)排列的文件描述符的路徑上打印關(guān)于對象的信息。這允許從活動提交(with cat-blob
)中打印
blob,或者復(fù)制之前提交中的blob或樹以用于當(dāng)前提交(with filemodify
)。
ls
命令可以在接受評論的流中的任何位置使用,包括提交的中間。
從活動提交中讀取
這種形式只能用在一個中間commit
。該路徑在快速導(dǎo)入的活動提交中命名目錄條目。在這種情況下必須引用路徑。
'ls' SP <path> LF
從命名樹中讀取
<dataref>
可以是標(biāo)記引用(:<idnum>
),也可以是預(yù)先存在或等待寫入的 Git 標(biāo)記,提交或樹對象的完整40字節(jié) SHA-1。該路徑相對于名為的樹的頂層<dataref>
。
'ls' SP <dataref> SP <path> LF
請參閱filemodify
上面的詳細(xì)說明<path>
。
輸出使用與以下相同的格式git ls-tree <tree> -- <path>
:
<mode> SP ('blob' | 'tree' | 'commit') SP <dataref> HT <path> LF
<dataref>代表斑點(diǎn)、樹,或在<路徑> commit 對象,并且可以在稍后被用于get-mark
,cat-blob
,filemodify
,或ls
命令。
如果在路徑上沒有文件或子樹,git fast-import
則會報告
missing SP <path> LF
有關(guān)如何安全讀取此輸出的詳細(xì)信息,請參閱下面的“對命令的響應(yīng)”。
feature
要求快速導(dǎo)入支持指定的功能,或者如果不支持則中止。
'feature' SP <feature> ('=' <argument>)? LF
命令的<feature>部分可以是以下任何一個:
日期格式 導(dǎo)出標(biāo)記 相對標(biāo)記 無相對標(biāo)記約束
就像在命令行上--
傳遞帶有前導(dǎo)的相應(yīng)命令行選項一樣(請參閱上面的 OPTIONS)。
import-marks import-marks-if-exists
與--import-marks一樣,除了兩個方面:首先,每個流只能使用一個“功能 import-marks” 或“ feature import-marks-if-exists ”命令; 第二,--import-marks =或--import-marks-if-exists 命令行選項將覆蓋流中的任何“特征”命令; 第三,“功能 import-marks-if-exists” 就像一個相應(yīng)的命令行選項,悄無聲息地跳過一個不存在的文件。
get-mark cat-blob ls
要求后端支撐get-mark
,cat-blob
或者ls
分別命令。不支持指定命令的快速導(dǎo)入版本將退出并顯示一條消息。這樣可以提前清除導(dǎo)入錯誤并顯示明確的消息,而不會在檢測到不支持的命令之前浪費(fèi)導(dǎo)入的早期時間。
notes
要求后端支持notemodify
命令的(N)子commit
命令??焖賹?dǎo)入不支持筆記的版本將退出,并顯示一條消息。
done
如果流沒有done
命令而結(jié)束,則返回錯誤。如果沒有此功能,導(dǎo)致前端在流中便利點(diǎn)突然結(jié)束的錯誤可能無法檢測到。例如,如果導(dǎo)入前端在中間操作中死掉,而在其下級 git 快速導(dǎo)入實例中未發(fā)出 SIGTERM 或 SIGKILL,則可能發(fā)生這種情況。
option
處理指定的選項,以便 git fast-import 以符合前端需求的方式運(yùn)行。請注意,前端指定的選項將被用戶可能指定的用于快速導(dǎo)入自身的任何選項覆蓋。
'option' SP <option> LF
<option>
命令的一部分可能包含 OPTIONS 部分中列出的任何不改變導(dǎo)入語義的選項,沒有前導(dǎo)--
并且以相同的方式處理。
選項命令必須是輸入中的第一個命令(不包括功能命令),以便在任何非選項命令發(fā)生錯誤后給出選項命令。
以下命令行選項更改導(dǎo)入語義,因此可能不會作為選項傳遞:
date-format
import-marks
export-marks
cat-blob-fd
force
done
如果done
功能未被使用,則視為已讀取 EOF 。這可以用來告訴快速導(dǎo)入提前完成。
如果--done
命令行選項或feature done
命令正在使用,則該done
命令是強(qiáng)制性的,并標(biāo)記流的結(jié)束。
通過快速導(dǎo)入寫入的新對象不可立即使用。大多數(shù)快速導(dǎo)入命令直到下一個檢查點(diǎn)(或完成)才會有明顯效果。前端可以發(fā)送命令來填充快速導(dǎo)入的輸入管道,而不用擔(dān)心它們的生效速度,通過簡化調(diào)度來提高性能。
然而,對于某些前端,能夠從當(dāng)前存儲庫更新數(shù)據(jù)時(例如,當(dāng)源材料按照要應(yīng)用于先前導(dǎo)入的對象的修補(bǔ)程序描述對象時)讀取數(shù)據(jù)很有用。這可以通過連接前端和通過雙向管道快速導(dǎo)入來完成:
mkfifo fast-import-output frontend <fast-import-output |git fast-import >fast-import-output
一個前端設(shè)置了這種方式可以使用progress
,get-mark
,ls
,和cat-blob
命令來讀取從正在進(jìn)行的進(jìn)口信息。
為了避免死鎖,例如前端必須完全消耗任何未決的輸出progress
,ls
,get-mark
,和cat-blob
之前執(zhí)行寫入可能會阻止快速導(dǎo)入。
如果快速導(dǎo)入提供了無效輸入,它將以非零退出狀態(tài)終止,并在其導(dǎo)入到的 Git 存儲庫頂層創(chuàng)建崩潰報告。崩潰報告包含內(nèi)部快速導(dǎo)入狀態(tài)的快照以及導(dǎo)致崩潰的最新命令。
所有最近的命令(包括流注釋,文件更改和進(jìn)度命令)都顯示在崩潰報告中的命令歷史記錄中,但原始文件數(shù)據(jù)和提交消息從崩潰報告中排除。此排除可節(jié)省報告文件內(nèi)的空間,并減少快速導(dǎo)入在執(zhí)行過程中必須執(zhí)行的緩沖量。
寫入崩潰報告后,快速導(dǎo)入將關(guān)閉當(dāng)前的包文件并導(dǎo)出標(biāo)記表。這允許前端開發(fā)人員檢查存儲庫狀態(tài)并從其崩潰點(diǎn)恢復(fù)導(dǎo)入。由于導(dǎo)入未成功完成,修改的分支和標(biāo)簽在崩潰期間未更新。分支和標(biāo)簽信息可以在崩潰報告中找到,并且必須在需要更新時手動應(yīng)用。
一個崩潰示例:
$ cat >in <<END_OF_INPUT # my very first test commit commit refs/heads/master committer Shawn O. Pearce <spearce> 19283 -0400# who is that guy anyway?data <<EOFthis is my commit EOF M 644 inline .gitignore data <<EOF.gitignore EOF M 777 inline bob END_OF_INPUT
$ git fast-import <infatal: Corrupt mode: M 777 inline bob fast-import: dumping crash report to .git/fast_import_crash_8434
$ cat .git/fast_import_crash_8434 fast-import crash report: fast-import process: 8434 parent process : 1391 at Sat Sep 1 00:58:12 2007
fatal: Corrupt mode: M 777 inline bob
Most Recent Commands Before Crash--------------------------------- # my very first test commit commit refs/heads/master committer Shawn O. Pearce <spearce> 19283 -0400 # who is that guy anyway? data <<EOF M 644 inline .gitignore data <<EOF* M 777 inline bob
Active Branch LRU----------------- active_branches = 1 cur, 5 max
pos clock name~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1) 0 refs/heads/master
Inactive Branches-----------------refs/heads/master: status : active loaded dirty tip commit : 0000000000000000000000000000000000000000 old tree : 0000000000000000000000000000000000000000 cur tree : 0000000000000000000000000000000000000000 commit clock: 0 last pack :
-------------------END OF CRASH REPORT
從快速導(dǎo)入的各種用戶收集了以下提示和技巧,并將其作為建議提供給您。
在執(zhí)行存儲庫轉(zhuǎn)換時,請為每個提交(mark :<n>
)使用一個唯一標(biāo)記,并在命令行上提供--export-marks 選項??焖賹?dǎo)入會轉(zhuǎn)儲一個文件,其中列出了每個標(biāo)記以及與其對應(yīng)的 Git 對象
SHA-1。如果前端可以將標(biāo)記綁定回源存儲庫,那么通過將每個
Git 提交與相應(yīng)的源修訂版進(jìn)行比較,可以很容易地驗證導(dǎo)入的準(zhǔn)確性和完整性。
來自諸如 Perforce 或 Subversion 之類的系統(tǒng)應(yīng)該非常簡單,因為快速導(dǎo)入標(biāo)記也可以是 Perforce 變更集編號或 Subversion 修訂版編號。
在進(jìn)口期間,不要試圖優(yōu)化前端來一次堅持一個分支。雖然這樣做對于快速導(dǎo)入可能會稍微快一些,但這往往會顯著增加前端代碼的復(fù)雜性。
內(nèi)部快速導(dǎo)入的分支 LRU 往往表現(xiàn)得非常好,激活非活動分支的成本非常低,以至于在分支間跳動幾乎不會影響導(dǎo)入性能。
在導(dǎo)入重命名文件或目錄時,只需刪除舊名稱并在相應(yīng)的提交期間修改新名稱即可。Git 會在事后執(zhí)行重命名檢測,而不是在提交期間顯式檢測。
一些其他 SCM 系統(tǒng)允許用戶從不同于提交/變更集的多個文件創(chuàng)建標(biāo)簽?;蛘邉?chuàng)建標(biāo)簽,這些標(biāo)簽是存儲庫中可用文件的子集。
如果不進(jìn)行至少一次“修復(fù)”文件以匹配標(biāo)簽內(nèi)容的提交,那么將這些標(biāo)簽原樣導(dǎo)入 Git 是不可能的。使用 fast-import reset
命令將正常分支空間外的虛擬分支重置為標(biāo)記的基本提交,然后提交一個或多個文件修復(fù)提交,最后標(biāo)記虛擬分支。
例如,因為所有正常的分支都refs/heads/
以標(biāo)簽修正分支的名字存儲TAG_FIXUP
。這樣,導(dǎo)入器使用的 fixup 分支不可能與從源導(dǎo)入的實際分支產(chǎn)生命名空間沖突(該名稱TAG_FIXUP
不是refs/heads/TAG_FIXUP
)。
在提交 fixup 時,考慮使用merge
將提供文件修訂的提交連接到
fixup 分支。這樣做可以讓工具git blame
跟蹤真實的提交歷史記錄并正確注釋源文件。
在快速導(dǎo)入終止后,前端將需要rm .git/TAG_FIXUP
去除虛擬分支。
只要快速導(dǎo)入完成,Git 存儲庫就完全有效并可以使用。通常這只需要很短的時間,即使是相當(dāng)大的項目(100,000+次提交)。
但是重新包裝存儲庫對于提高數(shù)據(jù)本地化和訪問性能是必需的。它也可能需要數(shù)小時才能完成大型項目(特別是如果使用-f和大型窗口參數(shù))。由于重新包裝可以安全地與讀者和作者一起運(yùn)行,因此在后臺運(yùn)行重新包裝并在完成時讓它完成。沒有理由等待探索你的新 Git 項目!
如果您選擇等待重新包裝,在重新包裝完成之前不要嘗試運(yùn)行基準(zhǔn)測試或性能測試??焖賹?dǎo)入輸出次優(yōu)包裝文件,這些包裝文件在實際使用情況下根本不會出現(xiàn)。
如果您要重新包裝非常舊的導(dǎo)入數(shù)據(jù)(例如比去年早),請考慮花費(fèi)一些額外的 CPU 時間并在運(yùn)行時提供--window = 50(或更高)git repack
。這將花費(fèi)更長時間,但也會產(chǎn)生一個較小的 packfile。您只需花費(fèi)一次工作量,而使用您項目的每個人都將受益于較小的存儲庫。
每隔一段時間你的前端都會發(fā)出一條progress
消息來快速導(dǎo)入。這些消息的內(nèi)容完全是自由格式,因此每次當(dāng)前提交日期進(jìn)入下個月時,一個建議就是輸出當(dāng)前的月份和年份。知道有多少數(shù)據(jù)流已被處理,您的用戶會感覺更好。
當(dāng)快速打包 blob 時,import 總是試圖對最后一個 blob 進(jìn)行分層。除非前端特別安排,否則這可能不會是同一文件的先前版本,因此生成的增量不會盡可能小。生成的 packfile 將被壓縮,但不會是最佳的。
有效訪問單個文件的所有修訂(例如讀取 RCS / CVS,v 文件)的前端可以選擇將該文件的所有修訂作為一系列連續(xù)blob
命令提供。這允許快速導(dǎo)入將不同的文件修訂彼此分開,從而節(jié)省最終包文件中的空間。標(biāo)記可用于稍后在一系列commit
命令中識別單個文件修訂版。
通過快速導(dǎo)入創(chuàng)建的包文件不會鼓勵良好的磁盤訪問模式。這是由于快速導(dǎo)入將數(shù)據(jù)按標(biāo)準(zhǔn)輸入接收的順序?qū)懭霐?shù)據(jù),而 Git 通常會在數(shù)據(jù)包文件中組織數(shù)據(jù)以使最新(當(dāng)前提示)數(shù)據(jù)出現(xiàn)在歷史數(shù)據(jù)之前。Git 還將提交進(jìn)行集群,通過更好的緩存局部性加快修訂遍歷。
出于這個原因,強(qiáng)烈建議用戶在快速導(dǎo)入完成后使用git repack -a -d
重新打包存儲庫,以便 Git 能夠重新組織文件包以加快數(shù)據(jù)訪問速度。如果 blob deltas 不理想(參見上文),那么添加-f
選項以強(qiáng)制所有delta的重新計算可以顯著減少最終的 packfil e 大小(小30-50%可能非常典型)。
有許多因素會影響快速導(dǎo)入執(zhí)行導(dǎo)入所需的內(nèi)存量。像核心 Git 的關(guān)鍵部分一樣,快速導(dǎo)入使用自己的內(nèi)存分配器來分?jǐn)偱c malloc 相關(guān)的任何開銷。在實踐中,由于使用大塊分配,快速導(dǎo)入傾向于將任何 malloc 開銷分?jǐn)偟?。
快速導(dǎo)入為在此執(zhí)行中寫入的每個對象維護(hù)一個內(nèi)存中結(jié)構(gòu)。在32位系統(tǒng)上,結(jié)構(gòu)為32字節(jié),在64位系統(tǒng)上,結(jié)構(gòu)為40字節(jié)(由于指針大小較大)。除非快速導(dǎo)入終止,否則表中的對象不會解除分配。在32位系統(tǒng)上導(dǎo)入200萬個對象需要大約64 MiB 的內(nèi)存。
對象表實際上是一個在對象名稱(唯一的 SHA-1)上鍵入的散列表。此存儲配置允許快速導(dǎo)入重用現(xiàn)有或已寫入的對象,并避免將重復(fù)項寫入輸出包文件。重復(fù)的斑點(diǎn)在導(dǎo)入中非常常見,通常是由于源中的分支合并。
標(biāo)記存儲在稀疏數(shù)組中,每個標(biāo)記使用1個指針(4個字節(jié)或8個字節(jié),取決于指針大?。?。雖然數(shù)組很稀疏,但前端仍強(qiáng)烈建議使用1到 n 之間的標(biāo)記,其中 n 是此導(dǎo)入所需的標(biāo)記總數(shù)。
分支被分類為活動和非活動。這兩個類的內(nèi)存使用情況明顯不同。
非活動分支存儲在使用96或120個字節(jié)(分別為32位或64位系統(tǒng))的結(jié)構(gòu)中,以及每個分支的分支名稱長度(通常小于200字節(jié))??焖賹?dǎo)入可輕松處理 2M 以下內(nèi)存中多達(dá)10,000個不活動的分支。
活動分支與非活動分支具有相同的開銷,但也包含該分支上最近修改的每個樹的副本。如果子樹include
自分支變?yōu)榛顒訝顟B(tài)以來未被修改,則其內(nèi)容不會被加載到內(nèi)存中,但如果子樹src
由于分支變?yōu)榛顒訝顟B(tài)而被修改了,則其內(nèi)容將被加載到內(nèi)存中。
由于活動分支存儲有關(guān)該分支中包含的文件的元數(shù)據(jù),因此其內(nèi)存中的存儲容量可能會增長到相當(dāng)大的規(guī)模(請參見下文)。
基于簡單的最近最少使用的算法,快速導(dǎo)入會自動將活動分支移至非活動狀態(tài)。LRU鏈在每個commit
命令上更新。使用 --active-branches = 可以在命令行上增加或減少活動分支的最大數(shù)量。
樹(又名目錄)在其條目所需內(nèi)存的頂部只使用12個字節(jié)的內(nèi)存(請參閱下面的“每個活動文件”)。一棵樹的成本幾乎為零,因為它的開銷分?jǐn)傇趩蝹€文件條目上。
Files (and pointers to subtrees) within active trees require 52 or 64 bytes (32/64 bit platforms) per entry. To conserve space, file and tree names are pooled in a common string table, allowing the filename “Makefile” to use just 16 bytes (after including the string header overhead) no matter how many times it occurs within the project.
活動分支 LRU 與文件名字符串池和子樹的延遲加載結(jié)合使用,可以在非常有限的內(nèi)存占用(每個活動分支小于2.7 MiB)的情況下,快速導(dǎo)入以有效導(dǎo)入2,000+個分支和45,114+個文件的項目。
向進(jìn)程發(fā)送 SIGUSR1 可以git fast-import
提前結(jié)束當(dāng)前的
packfile,模擬一條checkpoint
命令。不耐煩的操作員可以使用此工具來查看正在進(jìn)行的導(dǎo)入中的對象和引用,但需要花費(fèi)一些額外的運(yùn)行時間和更差的壓縮。