Gitリポジトリの内容をアーカイブとして配布したい
.gitディレクトリを含まず、コミット済みのファイルだけをtarやzipにまとめて配布したい場合がある。git cloneしてから.gitを手動で削除する方法もあるが、git archiveコマンドを使うと1コマンドでアーカイブを作成できる。
$ git archive --format=tar --output=app.tar HEAD
$ tar tf app.tar
README.md
src/
src/index.js
--formatでアーカイブ形式を指定し、--outputで出力先ファイルを指定する。HEADの部分にはブランチ名やタグ名、コミットハッシュも指定できる。
zip形式で出力する
--format=zipを指定すると、zip形式でアーカイブを作成できる。
$ git archive --format=zip --output=app.zip HEAD
$ unzip -l app.zip
Archive: app.zip
Length Date Time Name
--------- ---------- ----- ----
6 07-11-2026 08:17 README.md
0 07-11-2026 08:17 src/
15 07-11-2026 08:17 src/index.js
--------- -------
21 3 files
--outputに指定したファイルの拡張子から形式を推測できる場合、--formatは省略できる。
$ git archive --output=app.tar.gz HEAD
特定のタグやブランチをアーカイブする
HEADの代わりにタグ名やブランチ名を指定すると、そのコミット時点の内容をアーカイブできる。
$ git tag v1.0
$ git archive --format=tar --output=v1.0.tar v1.0
リリースごとのソースコードを配布したい場合などに使える。
アーカイブ内のディレクトリ名を指定する
--prefixオプションを付けると、アーカイブ内の各ファイルに指定したプレフィックスを付与できる。
$ git archive --format=tar --prefix=myapp/ --output=myapp.tar HEAD
$ tar tf myapp.tar
myapp/
myapp/README.md
myapp/src/
myapp/src/index.js
展開した際にmyappディレクトリの中にファイルが配置されるため、複数のアーカイブを同じディレクトリで展開しても混ざらない。
特定のファイルをアーカイブから除外する
.gitignoreはコミット対象外にするファイルを設定するものであり、コミット済みのファイルをgit archiveの出力から除外できない。.gitattributesにexport-ignoreを指定すると、コミット済みのファイルやディレクトリをgit archiveの出力から除外できる。
$ cat .gitattributes
docs export-ignore
$ git archive --format=tar HEAD | tar tf -
.gitattributes
.gitignore
README.md
src/
src/index.js
docsディレクトリが.gitattributesで管理されているにもかかわらず、アーカイブには含まれていない。テストコードやドキュメントなど、配布物に含めたくないファイルがある場合に活用できる。
参考
tarコマンド自体の使い方は以下も参照。
git-archive - Git Documentation\第一線のプログラマーの行動原理を学べる!/
