git の便利なコマンド git archive

tomon
2024-12-27
2024-12-27

git の便利なコマンド git archive

git管理下のファイルをアーカイブして取得することができます。

※公式のドキュメント
https://git-scm.com/docs/git-archive

git archive --format=zip --prefix=src/ -o src.zip main

mainブランチの内容をsrcというディレクトリの下に格納して、zipで圧縮し、src.zipとします。

git管理下のファイルを取得するのに、git cloneで引っ張ってくることはよくありますが、
コミット、ブランチなどの情報を必要とせず、ファイルだけあればよい
ということもあります。そういうときに使えます。

ネットで検索するといくつか記事がありますが
これを応用してブランチ間(あるいはコミット間)の差分ファイルを抽出することもできます。

git archive --format=zip develop --prefix=src/  -o archive.zip `git diff --diff-filter=MARC --name-only main develop`

こんな感じです。
ブランチmainとdevelopの間の差分ファイルをzipで圧縮して出力します。

ややこしいですねえ。何書いてあるか、わからん、という感じが。。実はそう難しくない。

分析すると、mainとdevelopの差分のファイル名を取得するのはこちらのコマンド

git diff --diff-filter=MARC --name-only main develop

これだけ実行してみると例えば以下のような出力になります。

$ git diff --diff-filter=MARC --name-only main develop
application/config/xxx
application/config/yyy
application/lib/zzz

このファイル名のリストをgit archiveコマンドに流し込んで、developのファイルを取得しています。

git archive --format=zip develop -o archive.zip --prefix=src/ `(上のgit diffコマンド)`

以前はgit diff --rawとかで出力したあと、プログラムで解析して、、とかやっていましたが
そのような手間はいらないです。

※git diffのドキュメント
https://git-scm.com/docs/git-diff

このコマンド、システム運用で時々使っていますが、注意点もあります。

① git diffのオプション --diff-filter=MARC としていますが、削除されたファイルは取得していないです。
 M:変更 A:追加 R:名前変更 C:コピー となります。
削除(D)したファイルもチェックしたいときは追加しますが、git archiveするときにファイルがないとおこられます。

② 差分ファイルを抽出するとき、上の例だと、developはmainの最新をマージ済としなければいけません。
developがmainから作成した後、mainにさらに別のコミットがあると、その差分もファイルとしてでてきます。
差分ファイルとして認識されるのはいいのですが、抽出されるのはdevelopのファイルになります。
デグレしてしまう可能性がありますので、気をつけましょう。

コマンドの意味を十分に理解して利用してください。