Git
英文 ▾ 主題 ▾ 最新版本 ▾ git-fast-export 上次更新於 2.45.0

名稱

git-fast-export - Git 資料匯出工具

概要

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

描述

此程式會以適合導向至git fast-import 的形式傾印給定的修訂。

您可以使用它作為人類可讀取的套件替換 (請參閱 git-bundle[1]),或作為可在饋入 git fast-import 之前編輯的格式,以便執行歷史重寫 (此功能由 git filter-repo 等工具依賴)。

選項

--progress=<n>

每 <n> 個物件插入 progress 陳述式,以便在匯入期間由 git fast-import 顯示。

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

指定如何處理簽署標籤。由於匯出後的任何轉換都可能變更標籤名稱 (排除修訂時也可能發生),因此簽名將不符。

當要求中止 (預設值) 時,此程式在遇到簽署標籤時將會終止。使用 strip,標籤將會以無聲方式取消簽署;使用 warn-strip,標籤將會取消簽署,但會顯示警告;使用 verbatim,它們將會以無聲方式匯出;使用 warn,它們將會匯出,但您將會看到警告。

--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 通訊協定對此非常嚴格,並且不允許這樣做。因此,偽造一個標籤者,以便能夠快速匯入輸出。

--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。可以指定多個 refspec。

[<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

這會從 master~5..master 建立一個名為 other 的新分支 (也就是說,如果 master 具有線性歷程記錄,則會取得最後 5 個提交)。

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

匿名化

如果使用 --anonymize 選項,git 會嘗試從儲存庫中移除所有可識別的資訊,同時保留足夠的原始樹狀結構和歷史模式,以重現某些錯誤。 目的是讓在私人儲存庫中發現的 git 錯誤能夠在匿名化的儲存庫中持續存在,而後者可以與 git 開發人員分享,以協助解決該錯誤。

使用此選項,git 會將輸出中的所有參考名稱(refname)、路徑、blob 內容、commit 和 tag 訊息、名稱以及電子郵件地址替換為匿名化的資料。 相同字串的兩個實例將被等效地替換(例如,具有相同作者的兩個 commit 將在輸出中具有相同的匿名化作者,但與原始作者字串沒有任何相似之處)。 commit、分支和 tag 之間的關係會被保留,commit 的時間戳記也會被保留(但 commit 訊息和參考名稱與原始訊息毫無相似之處)。 樹狀結構的相對組成會被保留(例如,如果您有一個包含 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 ...

如果匿名化的儲存庫顯示該錯誤,則可能值得分享 anon-stream 以及常規的錯誤報告。 請注意,匿名化串流的壓縮效果非常好,因此建議使用 gzip 壓縮。 如果您想檢查串流以查看它是否不包含任何私人資料,您可以在傳送之前直接仔細檢查。 您也可以嘗試

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

它會顯示所有唯一的行(數字會轉換為「X」,以便將「User 0」、「User 1」等合併為「User X」)。 這會產生更小的輸出,並且通常很容易快速確認串流中沒有任何私人資料。

重現某些錯誤可能需要參考特定的 commit 或路徑,這在參考名稱和路徑被匿名化之後會變得具有挑戰性。 您可以要求將特定的 token 保留原樣或對應到新的值。 例如,如果您有一個錯誤是透過 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

請注意,路徑和參考名稱會在斜線邊界處分割為 token。 上述命令會將 subdir/secret.c 匿名化為類似 path123/bar.c 的內容; 然後您可以在匿名化的儲存庫中搜尋 bar.c 以確定最終的路徑名稱。

為了簡化參考最終路徑名稱,您可以對應每個路徑組件; 因此,如果您也將 subdir 匿名化為 publicdir,則最終路徑名稱將為 publicdir/bar.c

限制

由於 *git fast-import* 無法標記樹狀結構,因此您將無法完全匯出 linux.git 儲存庫,因為它包含一個參考樹狀結構而非 commit 的標籤。

另請參閱

GIT

屬於 git[1] 套件的一部分

scroll-to-top