日本語 ▾ トピック ▾ 最新バージョン ▾ git-fast-export は 2.45.0 で最終更新されました

名前

git-fast-export - Gitデータエクスポートツール

書式

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

説明

このプログラムは、指定されたリビジョンを *git fast-import* にパイプできる形式でダンプします。

これは、人間が読めるバンドル形式の代替(git-bundle[1]を参照)として、または履歴の書き換え(*git filter-repo* のようなツールで利用される機能)を行うために *git fast-import* に渡す前に編集できるフォーマットとして使用できます。

オプション

--progress=<n>

インポート中に *git fast-import* によって表示されるよう、<n>オブジェクトごとに *progress* ステートメントを挿入します。

--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 の形式で書き込まれます。リビジョンに関するマークのみがダンプされ、ブロブに関するマークは無視されます。バックエンドはこのファイルを使用して、インポート完了後の検証や、インクリメンタル実行時のマークテーブルの保存に利用できます。<file> は完了時にのみ開かれ、切り詰められるため、同じパスを --import-marks に安全に指定することも可能です。新しいオブジェクトがマーク/エクスポートされていない場合、ファイルは書き込まれません。

--import-marks=<file>

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

--mark-tags

ブロブとコミットにマークIDを付けるだけでなく、タグにもラベルを付けます。これは --export-marks および --import-marks と組み合わせて使用する場合に役立ち、ネストされたタグのエクスポートにも有用(かつ必要)です。他のケースでは問題ありませんし、本来はデフォルトになるはずですが、多くの fast-import フロントエンドはマーク識別子付きのタグを受け入れる準備ができていません。

既にマークされているコミット(またはタグ)は再度エクスポートされません。バックエンドが同様の --import-marks ファイルを使用する場合、これによりマークを実行間で同じに保つことで、リポジトリのインクリメンタルな双方向エクスポートが可能になります。

--fake-missing-tagger

一部の古いリポジトリには、タガーがいないタグがあります。fast-import プロトコルはそれに対して非常に厳格で、許可していませんでした。そのため、出力を fast-import できるように、タガーを偽装します。

--use-done-feature

ストリームを *feature done* スタンザで開始し、*done* コマンドで終了します。

--no-data

ブロブオブジェクトの出力をスキップし、代わりに元のSHA-1ハッシュを介してブロブを参照します。これは、個々のファイルの内容に触れることなく、リポジトリのディレクトリ構造や履歴を書き換える場合に役立ちます。結果として生成されるストリームは、必要なオブジェクトが既に含まれているリポジトリでのみ使用できることに注意してください。

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

コミットとブロブの出力に、追加のディレクティブ original-oid <SHA1SUM> を追加します。このようなディレクティブは git-fast-import のようなインポーターにはおそらく無視されますが、中間フィルター(例えば、古いコミットを参照するコミットメッセージの書き換えや、IDによるブロブの削除など)には役立つ可能性があります。

--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つのコミットが対象となります)。

このリビジョン範囲で参照されるブロブとコミットメッセージのいずれにも、文字列 *refs/heads/master* が含まれていないことを前提としています。

匿名化

--anonymize オプションが指定された場合、Gitはリポジトリからすべての識別情報を削除しようとしますが、いくつかのバグを再現するために十分な元のツリーと履歴パターンは保持します。目標は、プライベートリポジトリで発見されたGitのバグが匿名化されたリポジトリでも再現され、その匿名化されたリポジトリをGit開発者と共有してバグ解決を支援できるようにすることです。

このオプションを使用すると、Gitは出力内のすべてのrefname、パス、ブロブの内容、コミットとタグのメッセージ、名前、およびメールアドレスを匿名化されたデータに置き換えます。同じ文字列の2つのインスタンスは同等に置き換えられます(例:同じ作者を持つ2つのコミットは、出力では同じ匿名化された作者になりますが、元の作者の文字列とは似ていません)。コミット、ブランチ、タグ間の関係は保持され、コミットのタイムスタンプも保持されます(ただし、コミットメッセージと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 ...

匿名化されたリポジトリでバグが再現する場合、通常のバグレポートとともに 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.cpath123/bar.c のように匿名化します。その後、匿名化されたリポジトリで bar.c を検索して最終的なパス名を特定できます。

最終的なパス名を参照しやすくするために、各パスコンポーネントをマッピングできます。したがって、subdirpublicdir に匿名化すると、最終的なパス名は publicdir/bar.c になります。

制限事項

*git fast-import* はツリーにタグを付けることができないため、linux.git リポジトリを完全にエクスポートすることはできません。このリポジトリにはコミットではなくツリーを参照するタグが含まれているためです。

関連項目

GIT

git[1] スイートの一部

scroll-to-top