git archive コマンドの使い方
Gitで管理しているワーキングディレクトリには .git ディレクトリやGit関連ファイルがあり、Git管理外のファイルなども含まれる可能性があります。
git archiveコマンドは指定したコミットのツリーをアーカイブしてくれるので、リリース用のファイル一式を作成するのに便利です。
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 というファイルを作成し、そこに下記のような設定をすることで特定のファイルを 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