簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-fast-export 最後更新於 2.51.0

名稱

git-fast-export - Git 資料匯出器

概要

git fast-export [<options>] | git fast-import

描述

此程式以適合透過管道傳輸到 git fast-import 的格式轉儲指定修訂版本。

您可以使用它作為人類可讀的 bundle 替代品(請參閱 git-bundle[1]),或者作為在反饋給 git fast-import 以進行歷史重寫(git filter-repo 等工具依賴的能力)之前可以編輯的格式。

選項

--progress=<n>

每 <n> 個物件插入一次進度語句,以便 git fast-import 在匯入期間顯示。

--signed-tags=(verbatim|warn-verbatim|warn-strip|strip|abort)

指定如何處理已簽名的標籤。由於匯出後的任何轉換(或匯出期間的轉換,例如排除修訂版本)都會改變被簽名的雜湊,因此簽名可能會失效。

當要求中止(這是預設值)時,此程式在遇到已簽名的標籤時將退出。使用strip,標籤將靜默地變為未簽名;使用warn-strip,它們將變為未簽名,但會顯示警告;使用verbatim,它們將靜默地匯出;使用warn-verbatim(或warn,一個已棄用的同義詞),它們將被匯出,但您會看到警告。只有當您知道您、fast-export 或 fast-import 不會執行任何影響標籤或其歷史記錄中任何提交的轉換,或者您不在乎生成的標籤將擁有無效簽名時,才應使用verbatimwarn-verbatim

--signed-commits=(verbatim|warn-verbatim|warn-strip|strip|abort)

指定如何處理已簽名的提交。行為與 --signed-tags 完全相同,但用於提交。預設值為 strip,這與沒有此選項的早期版本此命令的行為相同。

匯出時,簽名以

gpgsig <git-hash-algo> <signature-format>

開頭,其中 <git-hash-algo> 是 Git 物件雜湊,因此是 "sha1" 或 "sha256",而 <signature-format> 是簽名型別,因此是 "openpgp"、"x509"、"ssh" 或 "unknown"。

例如,對 SHA-1 提交的 OpenPGP 簽名以 gpgsig sha1 openpgp 開頭,而對 SHA-256 提交的 SSH 簽名以 gpgsig sha256 ssh 開頭。

雖然提交的所有簽名都會被匯出,但匯入器可以選擇只接受其中的一部分。例如,git-fast-import[1] 目前在每個 Git 雜湊演算法的每個提交中最多儲存一個簽名。

注意
這是高度實驗性的,並且資料流的格式將來可能會更改,恕不另行保證相容性。
--tag-of-filtered-object=(abort|drop|rewrite)

指定如何處理標籤指向被過濾物件的標籤。由於可以按路徑限制要匯出的修訂版本和檔案,因此標籤指向的物件可能會被完全過濾掉。

當要求中止(這是預設值)時,此程式在遇到此類標籤時將退出。使用drop,它將從輸出中省略此類標籤。使用rewrite,如果標籤指向的物件是提交,它將重寫標籤以指向一個祖先提交(透過父提交重寫;請參閱 git-rev-list[1])。

-M
-C

執行移動和/或複製檢測,如 git-diff[1] 手冊頁中所述,並使用它在輸出轉儲中生成重新命名和複製命令。

請注意,此命令的早期版本在給出這些選項時不會抱怨,並且會產生不正確的結果。

--export-marks=<file>

完成後將內部標記錶轉儲到 <file>。標記每行一個,格式為 :markid SHA-1。只轉儲修訂版本的標記;忽略 blob 的標記。後端可以使用此檔案在匯入完成後進行驗證,或跨增量執行儲存標記表。由於 <file> 僅在完成時開啟並截斷,因此可以將相同的路徑安全地傳遞給 --import-marks。如果沒有標記/匯出新物件,則不會寫入檔案。

--import-marks=<file>

在處理任何輸入之前,載入 <file> 中指定的標記。輸入檔案必須存在,必須可讀,並且必須使用 --export-marks 生成的相同格式。

--mark-tags

除了用標記 ID 標記 blob 和提交之外,還標記標籤。這在與 --export-marks--import-marks 結合使用時很有用,並且對於匯出巢狀標籤也很重要(也是必需的)。它不會影響其他情況,並且應該是預設值,但許多 fast-import 前端無法接受帶有標記識別符號的標籤。

任何已標記的提交(或標籤)都不會再次匯出。如果後端使用類似的 --import-marks 檔案,這允許透過在執行之間保持標記相同來實現儲存庫的增量雙向匯出。

--fake-missing-tagger

一些舊儲存庫中的標籤沒有標籤者。fast-import 協議對此非常嚴格,不允許這樣做。因此,偽造一個標籤者以便能夠 fast-import 輸出。

--use-done-feature

feature done語句開頭流,並以done命令結束。

--no-data

跳過 blob 物件的輸出,而是透過其原始 SHA-1 雜湊引用 blob。這在重寫儲存庫的目錄結構或歷史記錄而不觸及單個檔案內容時很有用。請注意,生成的流只能由已包含必要物件的儲存庫使用。

--full-tree

此選項將導致 fast-export 為每個提交發出一個“deleteall”指令,然後是提交中所有檔案的完整列表(而不是僅列出與提交的第一個父提交不同的檔案)。

--anonymize

匿名化儲存庫的內容,同時保留歷史記錄和儲存樹的形狀。請參閱下面的ANONYMIZING部分。

--anonymize-map=<from>[:<to>]

在匿名化輸出中將令牌<from>轉換為<to>。如果<to>被省略,則將<from>對映到自身(即,不進行匿名化)。請參閱下面的ANONYMIZING部分。

--reference-excluded-parents

預設情況下,執行git fast-export master~5..master之類的命令將不包括 master~5 提交,並且 master~4 將不再以 master~5 作為父提交(儘管舊的 master~4 和新的 master~4 將擁有所有相同的檔案)。使用 --reference-excluded-parents 來代替使用 sha1sum 來引用歷史記錄的排除範圍內的提交。請注意,生成的流只能由已包含必要的父提交的儲存庫使用。

--show-original-ids

為提交和 blob 新增一個額外的指令到輸出中,original-oid <SHA1SUM>。雖然 git-fast-import 之類的匯入器可能會忽略這些指令,但它可能對中間過濾器(例如,用於重寫引用舊提交的提交訊息,或按 ID 刪除 blob)很有用。

--reencode=(yes|no|abort)

指定如何處理提交物件中的encoding頭。當要求中止(這是預設值)時,此程式在遇到此類提交物件時將退出。使用yes,提交訊息將被重新編碼為 UTF-8。使用no,將保留原始編碼。

--refspec

將指定的 refspec 應用於每個匯出的 ref。可以指定多個。

[<git-rev-list-args>…​]

一系列引數,可被 git rev-parsegit rev-list 接受,用於指定要匯出的具體物件和引用。例如,master~10..master 會匯出當前的 master 引用以及自其第 10 個祖先提交以來新增的所有物件,以及(除非指定了 --reference-excluded-parents 選項)master~9 和 master~10 之間的所有公共檔案。

示例

$ git fast-export --all | (cd /empty/repository && git fast-import)

這將匯出整個儲存庫並將其匯入到現有的空儲存庫中。除了重新編碼非 UTF-8 編碼的提交之外,它將是一個一對一的映象。

$ git fast-export master~5..master |
	sed "s|refs/heads/master|refs/heads/other|" |
	git fast-import

這會建立一個名為 other 的新分支,從 master~5..master(即,如果 master 具有線性歷史,它將採用最後 5 個提交)。

請注意,這假定該修訂範圍引用的 blob 和提交訊息都不包含字串 refs/heads/master

匿名化

如果給定--anonymize選項,git 將嘗試從儲存庫中刪除所有識別資訊,同時保留足夠的原始樹和歷史模式來重現某些錯誤。目標是,在私有儲存庫中找到的 git 錯誤將在匿名化儲存庫中持續存在,後者可以與 git 開發人員共享以幫助解決該錯誤。

使用此選項,git 將用匿名化資料替換輸出中的所有 refname、路徑、blob 內容、提交和標籤訊息、名稱和電子郵件地址。相同的字串的兩個例項將被等效地替換(例如,兩個具有相同作者的提交將在輸出中具有相同的匿名化作者,但與原始作者字串無關)。提交、分支和標籤之間的關係得以保留,提交時間戳也得以保留(但提交訊息和 refname 與原始訊息無關)。樹的相對構成得以保留(例如,如果根樹有 10 個檔案和 3 個樹,則輸出也會如此),但它們的名稱和檔案的內容將被替換。

如果您認為您發現了 git 錯誤,可以先匯出整個儲存庫的匿名化流

$ git fast-export --anonymize --all >anon-stream

然後確認錯誤在從該流建立的儲存庫中仍然存在(許多錯誤不會,因為它們實際上依賴於確切的儲存庫內容)

$ git init anon-repo
$ cd anon-repo
$ git fast-import <../anon-stream
$ ... test your bug ...

如果匿名化儲存庫顯示了錯誤,則值得與 regular bug report 一起共享 anon-stream。請注意,匿名化流壓縮效果很好,因此鼓勵對其進行 gzip 壓縮。如果您想檢查流以檢視它不包含任何私有資料,您可以直接在傳送之前進行檢視。您可能還想嘗試

$ perl -pe 's/\d+/X/g' <anon-stream | sort -u | less

這將顯示所有唯一的行(並將數字轉換為“X”,以將“User 0”、“User 1”等合併為“User X”)。這會產生小得多的輸出,並且通常很容易快速確認流中沒有私有資料。

重現某些錯誤可能需要引用特定的提交或路徑,這在 refname 和路徑被匿名化後變得具有挑戰性。您可以要求特定令牌保持不變或對映到新值。例如,如果您有一個在使用git rev-list sensitive -- secret.c時重現的錯誤,您可以執行

$ git fast-export --anonymize --all \
      --anonymize-map=sensitive:foo \
      --anonymize-map=secret.c:bar.c \
      >stream

匯入流後,您可以在匿名化儲存庫中執行git rev-list foo -- bar.c

請注意,路徑和 refname 在斜槓邊界處被拆分為令牌。上面的命令會將subdir/secret.c匿名化為類似path123/bar.c的內容;然後您可以在匿名化儲存庫中搜索bar.c以確定最終的路徑名。

為了簡化對最終路徑名的引用,您可以對映每個路徑元件;因此,如果您還將subdir匿名化為publicdir,那麼最終的路徑名將是publicdir/bar.c

侷限性

由於 git fast-import 無法標記樹,因此您將無法完全匯出 linux.git 儲存庫,因為它包含一個引用樹而非提交的標籤。

另請參閱

GIT

Git[1] 套件的一部分