簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-fast-export 最後更新於 2.50.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> 個物件插入 progress 語句,以便在匯入時由 git fast-import 顯示。

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

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

當請求 abort(這是預設值)時,此程式在遇到簽名標籤時將終止。使用 strip 時,標籤將靜默地變為未簽名;使用 warn-strip 時,標籤將變為未簽名但會顯示警告;使用 verbatim 時,標籤將靜默匯出;使用 warn-verbatim(或已棄用的同義詞 warn)時,標籤將匯出,但會看到警告。verbatimwarn-verbatim 僅應在您知道不會由您或 fast-export 或 fast-import 執行影響標籤或其歷史記錄中任何提交的轉換,或者如果您不關心生成的標籤將具有無效簽名的情況下使用。

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

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

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

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

當請求 abort(這是預設值)時,此程式在遇到此類標籤時將終止。使用 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 頭。當請求 *abort*(這是預設值)時,此程式在遇到此類提交物件時將終止。使用 *yes* 時,提交訊息將被重新編碼為 UTF-8。使用 *no* 時,將保留原始編碼。

--refspec

將指定的 refspec 應用於每個匯出的引用。可以指定多個 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 將替換輸出中所有的引用名稱、路徑、blob 內容、提交和標籤訊息、名稱以及電子郵件地址為匿名化資料。相同字串的兩個例項將被等效替換(例如,具有相同作者的兩個提交在輸出中將具有相同的匿名化作者,但與原始作者字串沒有任何相似之處)。提交、分支和標籤之間的關係以及提交時間戳將被保留(但提交訊息和引用名稱與原始內容沒有任何相似之處)。樹的相對構成也將被保留(例如,如果您有一個包含 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 與常規 bug 報告一起共享。請注意,匿名化流的壓縮效果非常好,因此建議使用 gzip 壓縮。如果您想檢查流以確保其不包含任何私有資料,可以在傳送前直接查閱。您可能還想嘗試

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

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

重現某些錯誤可能需要引用特定的提交或路徑,這在引用名稱和路徑被匿名化後變得具有挑戰性。您可以要求某個特定令牌保持原樣或對映到新值。例如,如果您有一個透過 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

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

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

限制

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

另請參閱

GIT

Git[1] 套件的一部分

scroll-to-top