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)

署名付きタグの処理方法を指定します。エクスポート後の変換によってタグ名が変更される可能性があるため(リビジョンを除外する場合にも発生する可能性があります)、署名が一致しません。

*abort* (デフォルト)を指定すると、署名付きタグに遭遇したときにこのプログラムは停止します。*strip* を指定すると、タグは警告なしで署名なしになります。*warn-strip* を指定すると、タグは署名なしになりますが、警告が表示されます。*verbatim* を指定すると、警告なしでエクスポートされます。*warn* を指定すると、エクスポートされますが、警告が表示されます。

--tag-of-filtered-object=(abort|drop|rewrite)

タグ付けされたオブジェクトが除外されたタグの処理方法を指定します。エクスポートするリビジョンとファイルはパスによって制限される可能性があるため、タグ付けされたオブジェクトは完全に除外される場合があります。

*abort* (デフォルト)を指定すると、このようなタグに遭遇したときにこのプログラムは停止します。*drop* を指定すると、このようなタグは出力から省略されます。*rewrite* を指定すると、タグ付けされたオブジェクトがコミットの場合、タグを祖先コミットにタグ付けするように書き直します(親の書き換えによる。 git-rev-list[1] を参照)。

-M
-C

git-diff[1] マニュアルページに記載されているように、移動および/またはコピーの検出を実行し、それを使用して出力ダンプに名前変更およびコピーコマンドを生成します。

このコマンドの以前のバージョンでは、これらのオプションを指定してもエラーが発生せず、正しくない結果が生成されることに注意してください。

--export-marks=<file>

完了時に内部マークテーブルを <file> にダンプします。マークは1行に1つずつ `:markid SHA-1` として書き込まれます。リビジョンのマークのみがダンプされます。BLOBのマークは無視されます。バックエンドはこのファイルを使用して、インポートが完了した後に検証したり、増分実行全体でマークテーブルを保存したりできます。<file> は完了時にのみ開かれ、切り詰められるため、同じパスを --import-marks に安全に指定することもできます。新しいオブジェクトがマーク/エクスポートされていない場合、ファイルは書き込まれません。

--import-marks=<file>

入力を処理する前に、<file> で指定されたマークを読み込みます。入力ファイルは存在し、読み取り可能で、--export-marks によって生成されたものと同じ形式を使用する必要があります。

--mark-tags

BLOBとコミットにマークIDをラベル付けするだけでなく、タグにもラベル付けします。これは `--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

履歴と保存されたツリーの形状を保持しながら、リポジトリの内容を匿名化します。以下の「匿名化」セクションを参照してください。

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

匿名化された出力でトークン <from> を <to> に変換します。<to> が省略された場合、<from> はそれ自体にマップされます(つまり、匿名化されません)。以下の「匿名化」セクションを参照してください。

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

エクスポートされた各refに指定されたrefspecを適用します。複数指定できます。

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

*git rev-parse* および *git 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ではないコミットの再エンコードを除いて、1対1のミラーになります。

$ 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は出力内のすべてのref名、パス、BLOBの内容、コミットとタグのメッセージ、名前、メールアドレスを匿名化されたデータに置き換えます。同じ文字列の2つのインスタンスは同等に置き換えられます(たとえば、同じ作成者を持つ2つのコミットは、出力では同じ匿名化された作成者を持ちますが、元の作成者文字列とは似ていません)。コミット、ブランチ、タグの関係は、コミットのタイムスタンプと同様に保持されます(ただし、コミットメッセージとref名はオリジナルとは似ていません)。ツリーの相対的な構成は保持されます(たとえば、ルートツリーに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" にまとめられます)。これにより、出力サイズが大幅に削減され、ストリームにプライベートデータが含まれていないことを簡単に確認できます。

一部のバグの再現には、特定のコミットやパスを参照する必要がありますが、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] スイートの一部

scroll-to-top