git archive コマンドの使い方
git archiveコマンドは、Git管理化のファイル一式をアーカイブします。普通にアーカイブファイルを使っても同じことができますが、git archiveの対象ファイルはGit管理化のファイルに限定されるのと、差分だけを抽出することができるので便利です。
git archiveの簡単な書式例
git archive [コミットIDなど] -o [ファイル名]
[コミットIDなど]にはコミットIDやタグ名、ブランチ名などが指定可能です。
現在のブランチの最終コミットのツリーを archive.zip というファイル名でアーカイブするには次のようにします。
git archive HEAD -o archive.zip
-o オプションはアーカイブファイル名を指定します。対応しているアーカイブの形式は tar、zip です。
コミットの差分をアーカイブする方法
git archiveとgit diffを組み合わせて、特定のコミット間の差分のみをアーカイブすることもできます。
git archive [コミット1] `git diff --name-only [コミット2] [コミット3]` -o [ファイル名]
上記では、[コミット1] で抽出元のコミットを指定し、抽出したい差分をgit diffで指定しています。git diffに指定した --name-onlyはファイルのパスを返すので、これで差分のファイルパスを git archive に渡すことができます。
[コミット2]、[コミット3]には差分を取りたいコミット名を指定します。
例えば、HEADから2つ前のコミットの差分フィアルだけをアーカイブするには、次のようにします。
git archive HEAD `git diff --name-only HEAD HEAD~2` -o archive.zip
エラーの原因となるファイルを除外する
ファイル名に空白などがありうまくアーカイブできない場合、更にsedコマンドをパイプでつないでファイルを除外します。
下記では空白のあるファイルを除外しています。
git archive HEAD `git diff --name-only HEAD HEAD~2| sed '/ /d'` -o archive.zip
Git管理下にあるファイルを除外する
.gitignoreなどのGit関連ファイルもGit管理下にあれば、特に指定しないかぎりアーカイブファイルに含まれます。.gitattributesファイルを作成すれば、アーカイブに含めたくないファイルを指定することができます。
次の例では、.gitattributesというファイルを作成し、.gitignoreファイルをarchiveに含まない用に指定しています。
.gitignore を除外する
.gitignore export-ignore
.gitattributes で指定した設定を活かすには --worktree-attributes オプションを指定します。
git archive HEAD --worktree-attributes -o archive.zip
アーカイブ後の中身を確認する
期待通りのアーカイブができているか、アーカイブファイルの中身を確認するにはzipinfoコマンドが便利です。
zipinfo [アーカイブファイル名]
archive.zipに含まれるファイル一覧を出力するには下記のようにします。
zipinfo archive.zip
tar形式のファイルの場合は下記のようにします。
tar tvf archive.tar