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の出力から除外できない。.gitattributesexport-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