##はじめに
ソースコードの管理にgitを導入していても、案件によっては本番化とは連携しておらず、差分ファイルだけ必要になる事がよくあります。
コミットを指定して差分を抽出する方法は利用していたのですが、そもそも細かくコミット間の差分を抽出する必要性があまりなかったので、ターミナルから簡単にブランチの差分ファイルだけまとめてzipで抽出する方法をまとめてみました。
なお、今回紹介するやりかたは、選択中の作業ブランチとmasterブランチ間になります。
##基本のコマンド
とりあえず使いたい時はこれ。
git archive --format=zip --prefix=_diff/ HEAD `git diff master --diff-filter=ACMR --name-only` -o _diff.zip
良記事をよく見かけるので、git archive
の細かい説明は省きますが、これで現在のブランチとmasterブランチを比較して、差分を_diff.zip
に纏める事ができました。
###削除ファイルがあったときのエラー対策
削除したファイルがあるとエラーになってしまうので、--diff-filter
オプションで抽出ファイルを絞ることで削除ファイルを除外しています。
とりあえず以下で事足りていますが、場合によっては修正が必要かも。
A : 追加
C : コピー
M :修正
R :リネーム
なお、削除ファイルは、Dなので、必要であれば削除ファイルだけのリストも取得できます。
git diff master --diff-filter=D --name-only
##functionにして使うと楽
毎回オプション付きのコマンドを打つのが面倒くさいので、実際は、.bash_profile
(ここで良いのかな)にfunctionを追加して利用しています。
ローカルリポジトリのルートのディレクトリで実行する必要があります。
こちらでは解凍時に扱いやすくするため、zip内に格納されるディレクトリ名を_diff
ではなく、ローカルリポジトリのディレクトリ名で格納するようにしました。
bashで動作確認済み。
(daそれはdiff archiveの略)
function gitda() {
BASENAME=$(basename `pwd`)
git archive --format=zip --prefix=${BASENAME}/ HEAD `git diff master --diff-filter=ACMR --name-only` -o _diff.zip
}
使い方まとめ
-
.bash_profile
等にfunctionを追加。 - ターミナルでdiffを取りたいディレクトリへ移動し、masterとの差分を取りたいブランチになる。
-
gitda
を実行。 - 実行したディレクトリに
_diff.zip
が出来上がっていれば完了。
ちなみに、functionの中身だけ.shファイル化してSouceTreeのカスタムアクションに登録しても使えました。お好みでご利用頂ければ幸いです。