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のファイルになります。
デグレしてしまう可能性がありますので、気をつけましょう。
コマンドの意味を十分に理解して利用してください。