Gitテックラボ

git archive -Gitで管理しているファイルをアーカイブ

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

関連記事