Gitの小ネタおれおれAdvent Calendar 2022 – 16 日目

git archive ってのがあって、指定のブランチの内容を ZIP とかの書式で出してくれます。

Zip 出力

こんな感じ。

$ git archive --format=zip HEAD > ~/tmp/a.zip

出力先が標準出力(CLI の画面)である点に注意。> xxx.zip を付けてファイルに保存するようにします。

--format

zip の他に tar も受け付けます。

HEAD

出力したいブランチとかタグとかコミット ID とかです。色々受け付けてくれるみたい。

> xxx.zip

--output=xxx.zip というオプションもあるんだけどリダイレクトの方を普段使ってます。なんかよくエラーになっちゃうので……。あんまり調べてないけど特に不自由ないからいいやって。

ホームディレクトリーとか指定できないのかな。

$ git archive --format=zip --output="~/a.zip" HEAD 
fatal: could not create archive file '~/a.zip': No such file or directory

一部ファイルを除外

--worktree-attributes オプションを与えると、プロジェクトディレクトリーにある .gitattributes という設定ファイルを見るようになります。そこでプロジェクトディレクトリーに用意するとこのファイルは出力しないぞみたいな指定ができます。

.gitattributes

.gitattributes は設定ファイルで、プロジェクトディレクトリーに置きます。git archive 以外でも使えます。

内容は行ごとに書きます。先頭がファイルパスのパターンで、以下任意数の設定を続けます。

.env とか .env.local とか系のファイルを含めたくない場合の例。export-ignore が git archive で出さないぞ設定です。

.env* export-ignore

(基本的にはそもそもリポジトリーに入れておかない方が良いと思う。)

除外して圧縮ファイル作成

出力時に --worktree-attributes をお忘れなく。

$ git archive --format=zip --worktree-attributes HEAD > ~/tmp/a.zip

おしまい

.gitignore で無視されてるファイルは含まれないみたいです。逆に含める設定もあるのかな、みつからなかったけど。

自分は別名設定して git zip で出てくるようにしてます。今はもうないけど完成品を ZIP で納品しろって場面で使ってました。

参考