日本語 ▾ トピック ▾ 最新バージョン ▾ git-fast-export は 2.50.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>

git fast-import がインポート中に表示する progress ステートメントを <n> オブジェクトごとに挿入します。

--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 の形式で1行に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

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

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

エクスポートする特定のオブジェクトと参照を指定する、git rev-parse および git rev-list が受け入れる引数のリスト。たとえば、master~10..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 は出力内のすべての参照名、パス、ブロブコンテンツ、コミットおよびタグメッセージ、名前、およびメールアドレスを匿名化されたデータに置き換えます。同じ文字列の2つのインスタンスは同等に置き換えられます(例えば、同じ作者を持つ2つのコミットは、出力で同じ匿名化された作者を持ちますが、元の作者文字列とは似ていません)。コミット、ブランチ、タグ間の関係は保持され、コミットのタイムスタンプも保持されます(ただし、コミットメッセージと参照名は元のものとは似ていません)。ツリーの相対的な構成は保持されます(例えば、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

これはすべての一意な行を表示します("User 0"、"User 1" などを "User X" にまとめるために数字は "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.cpath123/bar.c のように匿名化します。その後、匿名化されたリポジトリで bar.c を検索して、最終的なパス名を決定できます。

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

制限事項

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

関連項目

GIT

git[1]スイートの一部

scroll-to-top